2010-01-05 8 views
6

sé que Android ofrece algunos métodos útiles que pueden anular con el fin de definir un menú:Android: ¿Cómo tener un menú compartido en cada actividad (Lista) sin volver a escribir los métodos reemplazados?

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

me gustaría tener este menú compartida por cada actividad y ListActivity de mi aplicación Android. Esto es para tener un menú estándar en cada Actividad (Lista) que permite al usuario saltar a cada parte de la aplicación con un clic.

En este momento, la forma más fácil de lograr esto es copiar y pegar ambos métodos en cada actividad (lista) de la aplicación. No me gusta esta redundancia de código escrito :)

¿Subclasificar es una opción razonable? Ya he visto que la subclasificación de una de mis ListActivity no funciona muy bien (los hilos que recuperan objetos de una base de datos están dando problemas). ¿Hay otras formas de compartir un menú en Actividades?

Gracias

Respuesta

10

que no ven ninguna razón esto no funcionaría a la perfección:

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

A continuación, sólo tienen sus actividades se extienden MyListActivity en lugar de ListActivity.

ya he visto que subclasificar uno de mis ListActivity no funciona muy bien (hilos que recuperan objetos de una base de datos están dando problemas ).

Esto suena como un problema completamente diferente. Es posible que desee publicar una pregunta por separado con respecto a esto. Simplemente extender una clase en Java no debería crear ningún problema como el que está describiendo.

+0

Esto está funcionando muy bien. Tengo que crear dos clases abstractas, una para las Actividades y otra para ListActivities (de lo contrario, el ejemplo que proporcionó no funcionará para Actividades simples). De todos modos, este código es mucho menos por escribir y satisface mis necesidades. ¡Gracias! – dgraziotin

+0

Si tiene una Actividad que extiende una ListActivity, necesita un ListView en su diseño, de lo contrario, se bloquea ... – jul

13

Utilizo una clase auxiliar con métodos estáticos para inicializar y manejar opciones de menú comunes, luego cada actividad define su propio onCreateOptionsMenu etc. que delega tareas comunes a la clase auxiliar, y puede agregar más elementos de menú específicos para esa actividad.

Algo así 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; 
    } 

} 

con más métodos para onMenuItemSelected etc.

Editar: No estoy usando una clase base común, ya que necesitaría dos de ellos para empezar, uno para las actividades y otra para actividades de la lista, y luego en mi caso necesito agregar opciones de menú personalizadas en algunas actividades.

+2

Evitar la creación de subclases es algo bueno. –

+0

Esta es también una buena respuesta, especialmente si necesita inflar opciones de menú personalizadas – dgraziotin

+0

@DanielYankowsky ¿Por qué es mejor evitar la creación de subclases en este caso? –

1

Acabo de agregar una función al GreenDroid para administrar eso. Puede ser bastante útil, compruébalo. Trataré de publicar un ejemplo más adelante.

Cuestiones relacionadas