2010-11-23 7 views
1

Ich versuche, einen Menüpunkt in meinem application.The Code zu implementieren hier für BaseScreen Klasse istBlackberry Menüpunkt Problem

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); 
    } 

} 

Jetzt bin erstreckt ich diese Klasse von Livescreen-Klasse

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; 
    }  
    } 
    } 

Dann Ich rufe die LiveScreen (was Listenitems anzeigt) -Klasse von SplashScreen & Drücken der LiveScreen

Aber wenn ich die Anwendung ausführen, und wenn die Kontrolle geht zu LiveScreen. Ich klicke auf das Menü, aber der Menüpunkt wird nicht angezeigt. Kann mir jemand sagen, wo ich die Fehler mache.

Antwort

2

Hoffentlich finden Sie das folgende hilfreich, wenn Ihre Frage nicht beantwortet wird, fühlen Sie bitte sich frei, zu antworten und Ihre Frage zu klären.

Wenn ich die Menüoption vom BaseScreen aus starte, würde ich den Code aktualisieren, so dass er einen Verweis auf den aktuellen Bildschirm enthält, anstatt getScreen() zu verwenden. Das liegt daran, dass die pushScreen-Methode sofort zurückkehrt und für mich sieht es so aus, als hätten Sie den Code aufgefordert, einen Bildschirm auf den Stapel zu schieben und ihn dann sofort wieder zu entfernen.

Hier ist, was die BaseScreen Änderung aussehen könnte:

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

Auf dem Live-Bildschirm, um zu sehen, was der Benutzer ausgewählt Sie die navigatorClick Methode im Hauptbildschirm verwenden können. Das codierte Beispiel verwendete einen Inline-MainScreen (ich würde dies normalerweise in eine eigene Klasse setzen).

Wenn Sie die Klassenvariablen myList und myListCallback erstellen oder die im Konstruktor erstellte Reihenfolge neu anordnen, können Sie die mainScreen-Instanziierung um eine neue navigationClick-Methode erweitern, die herausfindet, was angeklickt wurde.

Hier ist, was das wie in Livescreen aussehen könnte:

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

Sind Sie sicher, dass Sie mit Livescreen interagieren? Sieht aus wie die Livescreen

nennt
UiApplication.getUiApplication().pushScreen(mainScreen); 

so meine Vermutung (erraten, weil es schwer ist, so schlecht formatierte Code zu lesen) Sie einen Mainscreen auf der Oberseite und das ist, warum es nicht Ihren „Live“ Menüpunkt hält.