Android: Come avere un menu condiviso in ciascuna (List) Attività senza ri-scrivere i metodi sostituiti?

StackOverflow https://stackoverflow.com/questions/2006457

Domanda

So che Android fornisce alcuni metodi utili per essere sovrascritti per definire un menu:

    @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload);
                // ...
  return true;
 }

 public boolean onOptionsItemSelected(MenuItem item) {
  Intent i;
     switch (item.getItemId()) {
     case AIS: i = new Intent(this, ActivityInventorySheet.class);
      startActivity(i);
               return true;
     // ...
     }
     return false;
 }

Mi piacerebbe avere questo menu condiviso da ogni attività e ListActivity della mia applicazione Android. Questo è per avere un menu standard in ciascuna (List) Attività che consente il salto all'utente di ogni parte della domanda entro un clic.

In questo momento, il modo più semplice per raggiungere questo obiettivo è quello di copiare e incollare entrambi i metodi in ogni (List) Attività dell'applicazione. Non mi piace questa ridondanza di codice scritto:)

è sub-classing una scelta ragionevole? Ho già visto che (le discussioni che recuperano gli oggetti da un database stanno dando problemi) sub-classificare uno dei miei ListActivity non funziona molto bene. Ci sono altri modi per condividere un menu però Attività?

Grazie

È stato utile?

Soluzione

Non vedo alcuna ragione per cui questo non avrebbe funzionato perfettamente:

public abstract class MyListActivity extends ListActivity
{
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      menu.add(0, AIS, 0, "Activity Inventory Sheet").setIcon(android.R.drawable.ic_menu_upload);
      // ...
      return true;
   }

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
      Intent i;
      switch (item.getItemId()) {
          case AIS: i = new Intent(this, ActivityInventorySheet.class);
          startActivity(i);
          return true;
          // ...
      }
      return false;
   }    
}

Poi basta avere la vostra attività si estendono MyListActivity invece di ListActivity.

  

ho già visto che sub-classing   uno dei miei ListActivity non funziona   molto bene (le discussioni che recuperano   oggetti da un database stanno dando   problemi).

Questo suona come un problema completamente diverso. Si potrebbe desiderare di inviare una domanda separata per quanto riguarda questo. Semplicemente estendendo una classe in Java non dovrebbe creare alcun problema come quello che si sta descrivendo.

Altri suggerimenti

Io uso una classe di supporto con metodi statici per inizializzare e gestire le opzioni di menu comuni, allora ogni attività definisce la propria onCreateOptionsMenu ecc che i delegati compiti comuni alla classe di supporto, e può aggiungere ulteriori voci di menu specifici a tale attività.

Qualcosa di simile

class SharedMenu {
    public static void onCreateOptionsMenu(Menu menu) {
        menu.add(...);
        menu.add(...);
    }
}

public class MyActivity extends Activity {

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(...);  // specific to this activity
        SharedMenu.onCreateOptionsMenu(menu);
        return true;
    }

}

con più metodi per onMenuItemSelected etc.

Edit: non sto usando una classe base comune perché avevo bisogno di due di loro per cominciare, uno per le attività e un altro per le attività della lista, e quindi nel mio caso ho bisogno di aggiungere opzioni di menu personalizzati su alcuni attività.

Ho appena aggiunto una funzionalità per GreenDroid per gestire tale. Può essere molto utile, check it out. Cercherò di postare un esempio in seguito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top