2010-11-23 10 views
1

Je suis en train de mettre en œuvre un élément de menu dans mon code application.Le est ici pour BaseScreen classeproblème de l'élément de menu Blackberry

package com.kcrw.ui; 


import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.Graphics; 
import net.rim.device.api.ui.Keypad; 
import net.rim.device.api.ui.Manager; 
import net.rim.device.api.ui.MenuItem; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.component.Dialog; 
import net.rim.device.api.ui.component.Menu; 
import net.rim.device.api.ui.component.RichTextField; 
import net.rim.device.api.ui.container.FullScreen; 
import net.rim.device.api.ui.container.MainScreen; 



public class BaseScreen extends MainScreen { 

/*BaseScreen(){ 
super(); 
}*/ 
class NextQuesMenu extends MenuItem { 

    public NextQuesMenu() { 
     super("Live", 40, 10); 
    } 

    public void run() { 

      UiApplication.getUiApplication().pushScreen(new LiveScreen()); 
      UiApplication.getUiApplication().popScreen(getScreen()); 

     } 
    } 

protected void makeMenu(Menu menu, int instance) { 
     menu.add(new NextQuesMenu()); 
     super.makeMenu(menu, instance); 
    } 

} 

Maintenant, je tends cette classe de classe LiveScreen

package com.kcrw.ui; 
import net.rim.device.api.system.Bitmap; 
import net.rim.device.api.system.Display; 
import net.rim.device.api.ui.*; 
import net.rim.device.api.ui.component.*; 
import net.rim.device.api.ui.container.*; 
import com.kcrw.model.LiveStream; 
import java.util.Vector; 
import net.rim.device.api.system.Display; 
import net.rim.device.api.ui.Color; 
import net.rim.device.api.ui.DrawStyle; 
import net.rim.device.api.ui.Field; 
import net.rim.device.api.ui.Graphics; 
import net.rim.device.api.ui.Keypad; 
import net.rim.device.api.ui.Manager; 
import net.rim.device.api.ui.MenuItem; 
import net.rim.device.api.ui.UiApplication; 
import net.rim.device.api.ui.XYRect; 
import net.rim.device.api.ui.component.ListField; 
import net.rim.device.api.ui.component.ListFieldCallback; 
import net.rim.device.api.ui.component.Menu; 
import net.rim.device.api.ui.container.FullScreen; 
import net.rim.device.api.ui.container.HorizontalFieldManager; 
import net.rim.device.api.ui.container.MainScreen; 
import net.rim.device.api.ui.container.VerticalFieldManager; 
import com.kcrw.model.LiveStream; 
import com.kcrw.util.Constants; 
import java.util.Vector;  

    public class LiveScreen extends BaseScreen { 

    private static final String NOT_FOUND = "Not Found"; 
    private static final String NEWS_CHANNEL = "NEWS CHANNEL"; 
    private static final String MUSIC_CHANNEL = "MUSIC CHANNEL"; 
    private static final String ON_AIR_NOW = "ON AIR NOW"; 
    public static LiveStream liveStream; 
    public static LiveStream musicStream; 
    public static LiveStream newsStream; 
    public static DrawStyle topLive; 
    public static DrawStyle bottomLive; 
    MainScreen mainScreen; 
    /*switch (position) { 
    case 0: 
     if (liveStream.getProgram() == null) 
      return; 
     pid = "kcrwlive"; 
     url = liveStream.getProgram().getMobilePlayingImage() 
       .getImageUrl(); 
     showUrl = liveStream.getProgram().getPageUrl(); 
     title = ON_AIR_NOW; 
     desc = liveStream.getProgram().getDescription(); 
     if(bitRate==0) { 
      audioUrl = Constants.liveAudioUrl_64k; 
     } else { 
      audioUrl = Constants.liveAudioUrl_128k;      
     } 
     break; 
    case 1: 
     if (musicStream.getProgram() == null) 
      return; 
     pid = "kcrwmusic";     
     url = musicStream.getProgram().getMobilePlayingImage() 
       .getImageUrl(); 
     showUrl = musicStream.getProgram().getPageUrl(); 
     title = MUSIC_CHANNEL; 
     desc = musicStream.getProgram().getDescription(); 
     if(bitRate==0) { 
      audioUrl = Constants.musicAudioUrl_64k; 
     } else { 
      audioUrl = Constants.musicAudioUrl_128k;       
     } 
     break; 
    case 2: 
     if (newsStream.getProgram() == null) 
      return; 
     pid = "kcrwnews"; 
     url = newsStream.getProgram().getMobilePlayingImage() 
       .getImageUrl(); 
     showUrl = newsStream.getProgram().getPageUrl(); 
     title = NEWS_CHANNEL; 
     desc = newsStream.getProgram().getDescription(); 
     if(bitRate==0) { 
      audioUrl = Constants.newsAudioUrl_64k; 
     } else { 
      audioUrl = Constants.newsAudioUrl_128k;      
     } 
     break; 
    } 

    intent.putExtra(PlayerActivity.ALBUM_ID, pid); 
    intent.putExtra(PlayerActivity.ALBUM_TITLE, title); 
    intent.putExtra(PlayerActivity.ALBUM_IMAGE_URL, url); 
    intent.putExtra(PlayerActivity.ALBUM_AUDIO_URL, audioUrl); 
    intent.putExtra(PlayerActivity.ALBUM_SHOW_URL, showUrl);     
    intent.putExtra(PlayerActivity.ALBUM_DESCRIPTION, desc); 
    intent.putExtra(PlayerActivity.IS_PROGRAM, true); 

    LiveActivity.this.startActivity(intent); 
} 
}); 

}*/ 

    public LiveScreen(){ 
    //super(); 
    HorizontalFieldManager _hfm; 

    //The _vfm will hold the ListField and we'll add it to the _hfm 
VerticalFieldManager _vfm; 

//Create the vars for ListField creation 
final ListField myList; 
ListCallback myCallback; 


    //Get the device width and height 
    final int width = Display.getWidth(); 
    final int height = Display.getHeight(); 



//Create the mainScreen - this holds the _hfm and _vfm managers 
//MainScreen mainScreen; 
mainScreen = new MainScreen(); 

    //Private class that we will create in a minute 
    myCallback = new ListCallback(); 
    myCallback.erase(); 

myList = new MyListField(); 
myList.setCallback(myCallback); 

//Populate the list with sample elements 
for(int i=0;i<3;i++){ 
     myList.insert(i); 
     myCallback.insert(ON_AIR_NOW , 0); 
     myCallback.insert(MUSIC_CHANNEL , 1); 
     myCallback.insert(NEWS_CHANNEL , 2); 

} 



//Draw background gradient on this manager and add VerticalFieldManager for scrolling. 
    _hfm = new HorizontalFieldManager() { 

    public void paint(Graphics g) 
     { 


     //Variables for drawing the gradient 
    int[] X_PTS_MAIN = { 0, width, width, 0}; 
     int[] Y_PTS_MAIN = { 0, 0, height, height }; 
     int[] drawColors_MAIN = { Color.BLACK, Color.BLACK, Color.DARKBLUE, Color.DARKBLUE}; 


     try { 
     //Draw the gradients  
      g.drawShadedFilledPath(X_PTS_MAIN, Y_PTS_MAIN, null, drawColors_MAIN, null); 

     } catch (IllegalArgumentException iae) { 
      System.out.println("Bad arguments."); 
     } 



     //Call super to paint the graphics on the inherited window 
     super.paint(g); 


     } 

    //Sublayout is passed the width and height of the parent window and will tell the window manager 
    //how to layout the buttons, images, etc. 
    protected void sublayout(int w, int h) {  

    //GetFieldCount returns the number of fields attached to the instance of this manager. 
    //and lays out the position 
      if (getFieldCount() >0) {     

        Field searchRes = getField(0); 
        layoutChild(searchRes, width, height); 
        setPositionChild(searchRes,0,0); 

       } 



       setExtent(width,height); 

     } 


    }; 

    _vfm = new VerticalFieldManager(Manager.VERTICAL_SCROLL|Manager.USE_ALL_HEIGHT|Manager.USE_ALL_WIDTH) { 

      /*public void paint(Graphics g) 
      { 
       g.setColor(Color.GRAY);  
       super.paint(g); 

      } 

     protected boolean navigationMovement(int dx, int dy, int status, int time){ 
       this.invalidate(); 
       return super.navigationMovement(dx,dy,status,time); 
       } */ 

     protected void sublayout(int maxWidth, int maxHeight) { 



      layoutChild(myList, maxWidth, maxHeight); 
      setPositionChild(myList, 5, 385); 

      setExtent(maxWidth, maxHeight); 
     } 
     }; 




      //Add the list to the verticalFieldManager 
       _vfm.add(myList); 

       //Add the verticalFieldManager to the HorizontalFieldManager 
      _hfm.add(_vfm); 
      //Finally, add the HorizontalFieldManager to the MainScreen and push it to the stack 
      mainScreen.add(_hfm); 
       //pushScreen(mainScreen); 
      UiApplication.getUiApplication().invokeLater(new Runnable() { 
       public void run() { 
        UiApplication.getUiApplication().pushScreen(mainScreen); 
        //UiApplication.getUiApplication().popScreen(getActiveScreen()); 
       } 
      }); 

     }//End Ctor 

private class MyListField extends ListField{ 


     //0,ListField.MULTI_SELECT 
     private boolean hasFocus = false; 

     public void onFocus(int direction){ 
      hasFocus = true;  
     } 

      public void onUnfocus() 
      { 
        hasFocus = false; 
        super.onUnfocus(); 
        invalidate(); 
       } 

      public void paint(Graphics graphics) 
       { int width = Display.getWidth(); 
        //Get the current clipping region 
        XYRect redrawRect = graphics.getClippingRect(); 
        if(redrawRect.y < 0) 
        { 
         throw new IllegalStateException("Error with clipping rect."); 
        } 

       //Determine the start location of the clipping region and end. 
        int rowHeight = getRowHeight(); 

        int curSelected; 

        //If the ListeField has focus determine the selected row. 
        if (hasFocus) 
       { 
         curSelected = getSelectedIndex(); 

        } 
        else 
       { 
        curSelected = -1; 
       } 

        int startLine = redrawRect.y/rowHeight; 
        int endLine = (redrawRect.y + redrawRect.height - 1)/rowHeight; 
        endLine = Math.min(endLine, getSize() - 1); 
        int y = startLine * rowHeight; 

        //Setup the data used for drawing. 
        int[] yInds = new int[]{y, y, y + rowHeight, y + rowHeight}; 
        int[] xInds = new int[]{0, width, width, 0}; 

        //Set the callback - assuming String values. 
        ListFieldCallback callBack = this.getCallback(); 

        //Draw each row 
        for(; startLine <= endLine; ++startLine) 
        {     
        //If the line we're drawing is the currentlySelected line then draw the fill path in LIGHTYELLOW and the 
        //font text in Black.  
       if(startLine == curSelected){ 

          graphics.setColor(Color.LIGHTYELLOW); 
          graphics.drawFilledPath(xInds, yInds, null, null); 
          graphics.setColor(Color.BLACK); 
          graphics.drawText((String)callBack.get(this, startLine), 0, yInds[0]); 

        } 
        else{ 
          //Draw the odd or selected rows. 
         graphics.setColor(Color.LIGHTGREY); 
          graphics.drawText((String)callBack.get(this, startLine), 0, yInds[0]); 
        } 

        //Assign new values to the y axis moving one row down. 
         y += rowHeight; 
         yInds[0] = y; 
         yInds[1] = yInds[0]; 
         yInds[2] = y + rowHeight; 
         yInds[3] = yInds[2]; 
        } 

        //super.paint(graphics); 
       } 
     } 

    //Private class to populate the ListField private variable 
    private class ListCallback implements ListFieldCallback{ 


    private Vector listElements = new Vector(); 

     public void drawListRow(ListField list, Graphics g, 
          int index, int y, int w) {  

      String text = (String)listElements.elementAt(index); 
     g.setColor(Color.LIGHTGREY); 
      g.drawText(text, 0, y, 0, w);  
     } 

     public Object get(ListField list, int index) {  
     return listElements.elementAt(index); 
    }  

     public int indexOfList(ListField list, String p, int s) {  
      //return listElements.getSelectedIndex(); 
     return listElements.indexOf(p, s);  
     } 


     public void insert(String toInsert, int index) {  
     listElements.insertElementAt(toInsert, index);  
     } 

     public void add(String toInsert){ 
     listElements.addElement(toInsert); 
     } 

     public void erase() {  
      listElements.removeAllElements();  
     } 

    public int getPreferredWidth(ListField listField) { 

    return 0; 
    }  
    } 
    } 

Ensuite, J'appelle la classe LiveScreen (qui affiche listitems) de SplashScreen & en poussant le LiveScreen

Mais quand j'exécute l'application, et quand le contrôle va à LiveScreen. Je clique sur le menu, mais l'élément de menu n'est pas montré. Peut-on me guider où je fais les erreurs.

Répondre

2

Espérons que vous trouverez ce qui suit utile, si votre question ne reçoit pas de réponse s'il vous plaît n'hésitez pas à répondre et clarifier votre question. Lors du lancement de l'option de menu à partir de BaseScreen, je mettrais à jour le code afin qu'il inclue une référence à l'écran en cours au lieu d'utiliser getScreen(). C'est parce que la méthode pushScreen revient immédiatement et pour moi, il semble que vous ayez demandé au code de pousser un écran sur la pile, puis de le faire disparaître tout de suite.

Voici ce que le changement BaseScreen pourrait ressembler à:

public void run() { 
     UiApplication.getUiApplication().pushScreen(new LiveScreen()); 
     UiApplication.getUiApplication().popScreen(BaseScreen.this); 
    } 

Sur l'écran en direct pour voir ce que l'utilisateur vous sélectionné, vous pouvez utiliser la méthode navigatorClick dans l'écran principal. L'échantillon codé utilisait un MainScreen en ligne (je le mettrais normalement dans sa propre classe). Si vous créez les variables de classe myList et myListCallback ou réorganisez l'ordre dans lequel elles sont créées dans le constructeur, vous pouvez augmenter l'instanciation mainScreen pour inclure une nouvelle méthode navigationClick qui détecte les éléments sur lesquels vous avez cliqué.

Voici ce qui pourrait ressembler à LiveScreen:

final ListField myList; 
    final ListCallback myCallback; 

    ... 

    // MainScreen mainScreen; 
    mainScreen = new MainScreen(){ 
     protected boolean navigationClick(int status, int time) { 
      int selected = myList.getSelectedIndex(); 
      if (selected != -1) { 
       final Object o = myCallback.get(myList, selected); 
       UiApplication.getUiApplication().invokeLater(new Runnable() { 
        public void run() { 
         Status.show("Clicked on "+o); 
        } 
       }); 
      } 
      return true; 
     } 
    }; 
0

Êtes-vous sûr que vous interagissez avec LiveScreen? On dirait que le LiveScreen appelle

UiApplication.getUiApplication().pushScreen(mainScreen); 

donc je pense (deviner parce qu'il est difficile de lire le code si mal formaté) vous avez un MainScreen sur le dessus et c'est pourquoi il ne tient pas votre élément de menu « Live ».