Android: Como ter um menu partilhados em cada (Lista) Atividade sem re-escrever os métodos substituídos?

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

Pergunta

Eu sei que o Android fornece alguns métodos úteis para ser substituído, a fim de definir um 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;
 }

Eu gostaria de ter este menu compartilhado por cada atividade e ListActivity do meu aplicativo Android. Isto é para ter um menu padrão em cada (Lista) Actividade que permite o salto usuário para cada parte do aplicativo dentro de um clique.

Agora, a maneira mais fácil de conseguir isso é para copiar e colar os dois métodos em todos os (Lista) Atividade da aplicação. Eu não gosto dessa redundância de código escrito:)

É sub-classificar uma escolha razoável? Eu já vi que sub-classificar um dos meus ListActivity não funciona muito bem (tópicos que recuperam objetos de um banco de dados está dando problemas). Existem outras maneiras de compartilhar um menu embora Atividades?

Graças

Foi útil?

Solução

Não vejo razão isso não iria funcionar perfeitamente:

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

Em seguida, basta ter suas atividades estendem MyListActivity vez de ListActivity.

Eu já vi que sub-classing um dos meus ListActivity não funciona muito bem (tópicos que recuperam objetos a partir de um banco de dados está dando problemas).

Isso soa como um problema completamente diferente. Você pode querer postar uma pergunta separada em relação a este. Basta estender uma classe em Java não deve criar problemas como o que você está descrevendo.

Outras dicas

Eu uso uma classe auxiliar com métodos estáticos para inicializar e lidar com opções de menu comuns, então cada Atividade define sua própria onCreateOptionsMenu etc, que delega tarefas comuns à classe auxiliar, e pode adicionar mais itens de menu específico para essa atividade.

Algo como

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

}

com mais métodos para onMenuItemSelected etc.

Edit: Eu não estou usando uma classe base comum, porque eu precisaria de dois deles para começar, uma para atividades e outra para atividades de lista e, em seguida, no meu caso eu preciso adicionar opções de menu personalizado em alguns actividades.

I acabou de adicionar um recurso para GreenDroid para gerenciar isso. Pode ser bastante útil, check it out. Vou tentar postar um exemplo mais tarde.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top