2011-11-14 21 views
6

¿Hay alguna manera conveniente de mostrar las mismas opciones de menú de Opciones en varias Actividades?Código de menú Opciones de reutilización

Ejemplo: En mi aplicación, muestro una guía de TV de una de tres maneras.

  1. Siete guía días (TabActivity con 7 pestañas)
  2. Todos los canales 'Mostrando' (ListActivity)
  3. Todos los espectáculos hoy por hora de inicio (Actividad - podría ser cambiado fácilmente a ListActivity)

Para el menú Opciones en la TabActivity, el código es bastante simple ...

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    menu.clear(); 
    inflater.inflate(R.menu.gv_options_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.view: 
     ... 
    ... 
    } 
} 

... b Por el momento parece que necesito copiarlo/pegarlo en las otras dos actividades que no me gusta hacer. Si cambio el código del menú de Opciones para uno, también tendré que hacerlo para los otros dos.

La única alternativa que puedo pensar es que tengo una clase 'auxiliar' (POJO) a la que podría agregar un método y pasar el context para permitir el uso del método getMenuInflator() y otro método que podría pasar el resultado de item.getItemId() para procesar con la caja del interruptor.

¿Cuál es la forma normal de tener múltiples Actividades con el mismo menú de Opciones?

Respuesta

5

Un enfoque es utilizar la herencia con sus actividades. Cree una actividad base que implemente los métodos del menú de opciones y luego cada actividad secundaria obtendrá esa funcionalidad. Esta es la recommended approach en el sitio de desarrolladores de Android:

Consejo: Si la aplicación contiene múltiples actividades y algunos de ellos ofrecen el mismo menú de opciones, considere la creación de una actividad que implementa nada, excepto el onCreateOptionsMenu() y onOptionsItemSelected() métodos. Luego, amplíe esta clase para cada actividad que debería compartir el mismo menú de opciones. De esta forma, debe administrar solo un conjunto de códigos para manejar las acciones del menú y cada clase descendiente hereda los comportamientos del menú.

Lamentablemente, esto no funcionará para usted, ya que no hereda de Activity en sí sino de diferentes subclases, pero esa es la manera "normal" de hacerlo.

+0

Al final resultó que estaba olvidando que los contenidos de las pestañas de la actividad de la guía de 7 días son en realidad ListActivitys. He cambiado la actividad 'all shows today ...' (no 3 en mi pregunta) para ser también una ListActivity y definió una clase base que ahora se extienden las tres. Uno de esos momentos de no poder ver el bosque por los árboles. Gracias. – Squonk

10

crear una sencilla clase separada con estos dos métodos:

public class MyMenuHandler { 

    private Activity mActivity; 

    public MyMenuHandler(Activity activity) { 
     mActivity = activity; 
    } 

    public boolean onPrepareOptionsMenu(Menu menu) { 
     MenuInflater inflater = mActivity.getMenuInflater(); 
     menu.clear(); 
     inflater.inflate(R.menu.gv_options_menu, menu); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.view: 
      ... 
     } 
    } 
} 

En sus actividades tienen precedencia sobre los métodos de devolución de llamada y redirigir la llamada a una instancia de la clase MyMenuHandler:

public class MyActivity1 extends TabActivity { 

    private MyMenuHandler mMenuHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     mMenuHandler = new MyMenuHandler(this); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     // you may also add here some items which are specific 
     // for one activity, not for the others 
     ... 
     return mMenuHandler.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle selection of your specific items here, 
     // if none of them has been selected call mMenuHandler method 
     ... 
     return mMenuHandler.onOptionsItemSelected(item); 
    } 
} 

Esto le permitirá usted mantiene en un lugar el código que responde a la selección de sus elementos básicos del menú, por lo que no tendrá que preocuparse por copiarlo y pegarlo en todas las actividades que tengan el mismo menú.

+0

Perfecto a.ch. compañero. –

2

Puede encapsular su menú de acciones en fragment. De esta forma, solo necesita agregar el fragmento en el menú onCreate de su actividad.

Debe llamar al setHasOptionsMenu una vez que se haya creado el fragmento. Para agregar el fragmento de agregar use una etiqueta en lugar de una ID de diseño.

+0

Hola. ¿tiene algún buen ejemplo (tutorial o cualquier ejemplo) para esto? fragmento es bastante nuevo para mí. – xDragonZ

+0

comience con este http://developer.android.com/guide/topics/fundamentals/fragments.html – Janusz

+0

Tenga en cuenta que esto es aplicable si está utilizando API Nivel 11 o superior –

Cuestiones relacionadas