2010-04-16 12 views
5

Sono un principiante in programmazione BlackBerry, ho bisogno di sostituire nella mia applicazione il menu di default (quando si preme il tasto menu) per un menu personalizzato, orizzontale. Il migliore per descrivere è che voglio lo stesso risultato come l'applicazione per BlackBerry WeatherEye ...BlackBerry - Custom menu a barra degli strumenti

alt text http://www.blackberrybing.com/resource/pics/201002/WeatherEye-OS-45.jpg

Io so come creare il menu di default, ma questo non ho idea! Grazie,

risposta

10

Cosa è necessario fare è:

  • creare SizebleVFManager (ContentManager) come estensione della VerticalFieldManager
  • set di larghezza ed altezza di visualizzazione = (altezza del display - altezza del menu) formato da ContentManager
  • aggiungere ContentManager per lo screening
  • creare HorizontalFieldManager (menuManager)
  • creare BitmapButtonField (MenuButton) come una ca Sion di ButtonField
  • set FieldChangeListeners a menuButtons
  • aggiungono menuButtons a menuManager
  • aggiungere menuManager per lo screening

Esempio di SizebleVFManager:

class SizebleVFManager extends VerticalFieldManager 
{ 
    int mWidth = 0; 
    int mHeight = 0; 
    public SizebleVFM(int width, int height, long style) { 
     super(style); 
     mWidth = width; 
     mHeight = height; 
    } 

    public SizebleVFM(int width, int height) { 
     mWidth = width; 
     mHeight = height; 
    } 

    public int getPreferredWidth() { 
     return mWidth; 
    } 

    public int getPreferredHeight() { 
     return mHeight; 
    } 

    protected void sublayout(int width, int height) { 
     width = getPreferredWidth(); 
     height = getPreferredHeight(); 
     super.sublayout(width, height); 
     setExtent(width, height); 
    } 
} 

...

SizebleVFManager contentManager = 
    new SizebleVFManager(Display.getWidth(), Display.getHeight(), 
     VERTICAL_SCROLL|VERTICAL_SCROLLBAR); 

Vedi anche
sample of BitmapButtonField and Toolbar

PS anche se la sua migliore menu per utilizzare standard di ...

UPDATE

Se si desidera disattivare la funzionalità di menu di default, annullare MENU keydown:

protected boolean keyDown(int keycode, int time) { 
    if(Keypad.KEY_MENU == Keypad.key(keycode)) 
    { 
     return true; 
    } 
    else 
    return super.keyDown(keycode, time); 
} 

UPDATE

Ho installato quel meraviglioso weather application e compreso questo campione può essere più simili con diversi miglioramenti:

  • uso CyclicHFManager come un'estensione del HorizontalFieldManager
  • mostra/nascondi menuManager sul pulsante Menu clic

CyclicHFManager è un gestore che manterrà l'attenzione sullo stesso posto visivamente ed eseguirà tutti i campi sopra, in ciclo.Come in BlackBerry - Custom centered cyclic HorizontalFieldManager

class CyclicHFManager extends HorizontalFieldManager { 
    int mFocusedFieldIndex = 0; 
    boolean mCyclicTurnedOn = false; 

    public void focusChangeNotify(int arg0) { 
     super.focusChangeNotify(arg0); 
     if (mCyclicTurnedOn) { 
      int focusedFieldIndexNew = getFieldWithFocusIndex(); 
      if (focusedFieldIndexNew != mFocusedFieldIndex) { 
       if (focusedFieldIndexNew - mFocusedFieldIndex > 0) 
        switchField(0, getFieldCount() - 1); 
       else 
        switchField(getFieldCount() - 1, 0); 
      } 
     } 
     else 
     { 
      mFocusedFieldIndex = getFieldWithFocusIndex(); 
     } 
    } 

    private void switchField(int prevIndex, int newIndex) { 
     Field field = getField(prevIndex); 
     delete(field); 
     insert(field, newIndex); 
    } 
} 

alt text http://img109.imageshack.us/img109/6176/toolbarj.jpg

E esempio di codice intero:

abstract class AScreen extends MainScreen { 
    boolean mMenuEnabled = false; 
    SizebleVFManager mContentManager = null; 
    CyclicHFManager mMenuManager = null; 

    public AScreen() { 
     mContentManager = new SizebleVFManager(Display.getWidth(), Display 
       .getHeight(), VERTICAL_SCROLL | VERTICAL_SCROLLBAR); 
     add(mContentManager); 

     // mMenuManager = new CyclicHFManager(Display.getWidth(), 60); 
     mMenuManager = new CyclicHFManager(); 
     mMenuManager.setBorder(BorderFactory.createBevelBorder(new XYEdges(4, 
       0, 0, 0), new XYEdges(Color.DARKBLUE, 0, 0, 0), new XYEdges(
       Color.WHITE, 0, 0, 0))); 
     mMenuManager.setBackground(BackgroundFactory 
       .createLinearGradientBackground(Color.DARKBLUE, Color.DARKBLUE, 
         Color.LIGHTBLUE, Color.LIGHTBLUE)); 

     for (int i = 0; i < 10; i++) { 
      Bitmap nBitmap = new Bitmap(60, 60); 
      Graphics g = new Graphics(nBitmap); 
      g.setColor(Color.DARKBLUE); 
      g.fillRect(0, 0, 60, 60); 
      g.setColor(Color.WHITE); 
      g.drawRect(0, 0, 60, 60); 
      Font f = g.getFont().derive(Font.BOLD, 40); 
      g.setFont(f); 
      String text = String.valueOf(i); 
      g.drawText(text, (60 - f.getAdvance(text)) >> 1, (60 - f 
        .getHeight()) >> 1); 

      Bitmap fBitmap = new Bitmap(60, 60); 
      g = new Graphics(fBitmap); 
      g.setColor(Color.DARKBLUE); 
      g.fillRect(0, 0, 60, 60); 
      g.setColor(Color.GOLD); 
      g.drawRect(0, 0, 60, 60); 
      g.setFont(f); 
      g.drawText(text, (60 - f.getAdvance(text)) >> 1, (60 - f 
        .getHeight()) >> 1); 

      BitmapButtonField button = new BitmapButtonField(nBitmap, fBitmap, 
        fBitmap); 
      button.setCookie(String.valueOf(i)); 
      button.setPadding(new XYEdges(0, 18, 0, 18)); 

      button.setChangeListener(new FieldChangeListener() { 
       public void fieldChanged(Field field, int context) { 
        Dialog.inform("Button # " + (String) field.getCookie()); 
       } 
      }); 

      mMenuManager.add(button); 
     } 
    } 

    protected boolean keyDown(int keycode, int time) { 
     if (Keypad.KEY_MENU == Keypad.key(keycode)) { 
      if (mMenuManager.getManager() != null) { 
       delete(mMenuManager); 
       mMenuManager.mCyclicTurnedOn = false; 
       mContentManager.updateSize(Display.getWidth(), Display 
         .getHeight()); 
      } else { 
       add(mMenuManager); 
       mMenuManager.getField(2).setFocus(); 
       mMenuManager.mCyclicTurnedOn = true; 
       mContentManager.updateSize(Display.getWidth(), Display 
         .getHeight() 
         - mMenuManager.getHeight()); 
      } 
      return true; 
     } else 
      return super.keyDown(keycode, time); 
    } 
} 

class FirstScreen extends AScreen { 

    public FirstScreen() { 
     mContentManager.add(new LabelField("This is a first screen")); 
    } 
} 

public class ToolbarMenuApp extends UiApplication { 

    public ToolbarMenuApp() { 
     pushScreen(new FirstScreen()); 
    } 

    public static void main(String[] args) { 
     (new ToolbarMenuApp()).enterEventDispatcher(); 
    } 

} 
+0

risposta impressionante, max. Ancora una volta fai di tutto per pubblicare una risposta dettagliata con il codice. Vorrei poter +5 revocare questo. :) –

+0

Grazie Marco! :) –

+0

La prossima settimana riprenderò a lavorare su questo progetto, ma quello che ho letto e rapidamente provato sembra fantastico! È molto utile, grazie! Avrò ancora bisogno di qualche aggiustamento per fare quello che voglio (esattamente come l'App WeatherEye), come avere il menu visibile (abilitato) tutto il tempo e l'avviso funzionante (ho invece una schermata bianca). Tornerò qui entro la prossima settimana Sono sicuro che ahah. Ma ancora, GRAZIE! – Dachmt