Android: Como ter um menu partilhados em cada (Lista) Atividade sem re-escrever os métodos substituídos?
-
18-09-2019 - |
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
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.