2011-11-14 12 views
6

Esiste un modo conveniente per mostrare le stesse opzioni del menu Opzioni in più attività?Riutilizzo del menu Opzioni codice

Esempio: nella mia app, visualizzo una guida TV in uno dei tre modi.

  1. Sette guida giornata (TabActivity con 7 schede)
  2. tutti i canali 'Ora mostra' (ListActivity)
  3. Tutti gli spettacoli oggi da ora di inizio (Attività - potrebbe essere modificato facilmente per ListActivity)

Per il menu Opzioni nella TabActivity, il codice è molto semplice ...

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    menu.clear(); 
    inflater.inflate(R.menu.gv_options_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.view: 
     ... 
    ... 
    } 
} 

... B ut al momento sembra che ho bisogno di copiare/incollarlo alle altre due attività che non mi piace fare. Se cambio il codice del menu Opzioni per uno, dovrò farlo anche per gli altri due.

L'unica alternativa che posso pensare è che ho un 'aiutante' di classe (POJO) a cui ho potuto aggiungere un metodo e passare il context in per consentire l'utilizzo del metodo getMenuInflator() e un altro metodo ho potuto passare il risultato di item.getItemId() da elaborare con l'interruttore.

Qual è il modo normale di avere più attività con lo stesso menu Opzioni?

risposta

5

Un approccio consiste nell'utilizzare l'ereditarietà con le attività. Crea un'attività di base che implementa i metodi del menu delle opzioni e quindi ogni attività figlio acquisirà tale funzionalità. Questo è il recommended approach sul sito degli sviluppatori Android:

Suggerimento: se l'applicazione contiene molteplici attività e alcuni di loro forniscono le stesse opzioni di menu, prendere in considerazione la creazione di un'attività che implementa nulla se non l'onCreateOptionsMenu() e onOptionsItemSelected() metodi. Quindi estendi questa classe per ogni attività che dovrebbe condividere lo stesso menu Opzioni. In questo modo, devi gestire solo un set di codice per gestire le azioni del menu e ogni classe discendente eredita i comportamenti del menu.

Purtroppo questo non funziona per voi come non si eredita da attività in sé, ma diverse sottoclassi di esso, ma questo è il modo 'normale' per farlo.

+0

Come ho scoperto, dimenticavo che i contenuti della scheda dell'attività di guida di 7 giorni sono in realtà ListActivitys: ho modificato anche l'attività "tutti mostra oggi ..." (numero 3 nella mia domanda) ListActivity e ha definito una classe base che ora si estende a tutti e tre. Uno di quei momenti in cui non si riesce a vedere la foresta per gli alberi. Grazie. – Squonk

10

creare un semplice classe separata con questi due metodi:

public class MyMenuHandler { 

    private Activity mActivity; 

    public MyMenuHandler(Activity activity) { 
     mActivity = activity; 
    } 

    public boolean onPrepareOptionsMenu(Menu menu) { 
     MenuInflater inflater = mActivity.getMenuInflater(); 
     menu.clear(); 
     inflater.inflate(R.menu.gv_options_menu, menu); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.view: 
      ... 
     } 
    } 
} 

Nelle vostre attività sostituiscono quelli metodi di callback e reindirizzare la chiamata a un'istanza della classe MyMenuHandler:

public class MyActivity1 extends TabActivity { 

    private MyMenuHandler mMenuHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     mMenuHandler = new MyMenuHandler(this); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // you may also add here some items which are specific 
     // for one activity, not for the others 
     ... 
     return mMenuHandler.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle selection of your specific items here, 
     // if none of them has been selected call mMenuHandler method 
     ... 
     return mMenuHandler.onOptionsItemSelected(item); 
    } 
} 

Questo vi permetterà di tieni in un posto il codice che risponde alla selezione delle voci di menu di base, quindi non sarà necessario preoccuparsi di copiarlo in copia in tutte le attività che devono avere lo stesso menu.

+0

Perfect a.ch. compagno. –

2

È possibile incapsulare il menu di azione in un fragment. In questo modo hai solo bisogno di aggiungere il frammento nel menu onCreate della tua attività.

È necessario chiamare setHasOptionsMenu una volta creato il frammento. Per aggiungere il frammento di aggiunta, utilizzare un tag anziché un id di layout.

+0

Ciao. hai qualche buon esempio (tutorial o qualsiasi esempio) per questo? il frammento è abbastanza nuovo per me. – xDragonZ

+0

inizia con questo http://developer.android.com/guide/topics/fundamentals/fragments.html – Janusz

+0

Si noti che questo è applicabile se si utilizza API di livello 11 o superiore –

Problemi correlati