Android: Comment avoir un menu partagé dans chaque (Liste) Activité sans réécrivant les méthodes surchargées?

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

Question

Je sais que Android fournit des méthodes utiles à redéfinis afin de définir 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;
 }

Je voudrais avoir ce menu partagé par chaque activité et ListActivity de mon application Android. Ceci est d'avoir un menu standard dans chaque (Liste) Activité qui permet le saut de l'utilisateur à chaque partie de l'application dans un clic.

En ce moment, la meilleure façon d'y parvenir est de copier-coller les deux méthodes dans tous les (Liste) Activité de l'application. Je n'aime pas cette redondance de code écrit:)

est sous-classing un choix raisonnable? Je l'ai déjà vu que les sous-classes un de mes ListActivity ne fonctionne pas très bien (threads qui récupèrent des objets à partir d'une base de données donnant des problèmes). Y at-il d'autres façons de partager un menu bien Activités?

Merci

Était-ce utile?

La solution

Je ne vois aucune raison pour cela ne fonctionne pas parfaitement:

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

Alors que vos activités ont étendent MyListActivity au lieu de ListActivity.

  

Je l'ai déjà vu cette sous-classage   un de mes ListActivity ne fonctionne pas   très bien (les discussions qui extraient   des objets de la base de données donnent   problèmes).

Cela ressemble à un problème complètement différent. Vous pouvez poster une autre question à ce sujet. une simple extension d'une classe en Java ne devrait pas créer de problèmes comme celui que vous décrivez.

Autres conseils

J'utilise une classe d'aide avec des méthodes statiques pour initialiser et gérer les options de menu communes, chaque activité définit sa propre onCreateOptionsMenu etc. que les délégués des tâches communes à la classe d'aide, et peut ajouter d'autres éléments de menu spécifiques à cette activité.

Quelque chose comme

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

}

avec plus de méthodes pour onMenuItemSelected etc.

Edit: Je ne suis pas en utilisant une classe de base commune parce que je avais besoin de deux d'entre eux pour commencer, une pour les activités et l'autre pour les activités de la liste, puis dans mon cas, je dois ajouter des options de menu personnalisé sur certains activités.

Je viens d'ajouter une fonctionnalité à GreenDroid pour gérer cela. Peut être très utile, vérifier. Je vais essayer de poster un exemple plus tard.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top