2010-07-01 11 views
6

Tengo un problema al usar ActivityGroup. Tengo dos actividades dentro de un ActivityGroup y ambas usan un menú (anulando onCreateOptionMenu y onOptionsItemSelected).Android ActivityGroup Menu Problema

Bueno, el problema es que la segunda actividad del grupo no muestra el menú cuando presiono la tecla de menú. La primera actividad funciona bien mostrando el menú.

¿Alguna idea de este problema?

que tienen el código de la actividad infantil:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    boolean result = super.onCreateOptionsMenu(menu); 
    menu.add(0, MENU_REFRESH, 0, R.string.menu_refresh).setIcon(R.drawable.ic_menu_refresh); 
    return result; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case MENU_REFRESH: 
     Log.d(TAG,"REFRESH"); 
     refresh(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
+0

Creo que este es un comportamiento sorprendente de la segunda actividad. Intente seleccionar cualquier control en la actualidad en la segunda actividad y luego presione el botón de menú. El menú aparecerá, pero no sé por qué. –

+0

Tengo el mismo problema, estoy obteniendo el mismo menú para la segunda actividad también. incluso tengo un menú separado para definir la segunda actividad. por favor, hágamelo saber cómo solucionar este problema – Sam

Respuesta

1

Comprobar this hilo.

de menú puede ser utilizado de la matriz aactivity , pero crea en el niño actividad

+0

bien, pero ¿cómo puedo invocar un método de la actividad secundaria si manejo el menú en la actividad principal? – xger86x

+0

@ xger86x: ese es el problema. Debe manejar el menú en una actividad secundaria que no esté en el principal. – Macarse

+0

@macarse ok así que ... ¿cómo hago eso? ¿entiendes mi pregunta? Si tengo que invocar un método sobre la actividad del niño, no puedo hacerlo desde el padre. – xger86x

7

Otra buena manera de manejar esto es mediante el uso de LocalActivityManager del ActivityGroup. Obtener el gestor de la actividad local, obtener la actividad actual, y llevar a cabo método apropiado de esa actividad:

public boolean onPrepareOptionsMenu(Menu menu) { 
    //super.onPrepareOptionsMenu(menu); 
    return getLocalActivityManager().getCurrentActivity() 
     .onCreateOptionsMenu(menu); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 
    //super.onCreateOptionsMenu(menu); 
    return getLocalActivityManager().getCurrentActivity() 
     .onCreateOptionsMenu(menu); 
} 

public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    //super.onMenuItemSelected(featureId, item); 
    return getLocalActivityManager().getCurrentActivity() 
     .onMenuItemSelected(featureId, item); 
} 

Nota: el uso de esta estrategia, no debe llamar super.onCreateOptionsMenu del niño actividad- que esto provoca que una excepción de desbordamiento de pila . No estoy seguro de cuál es el propósito de llamar a la superclase en * métodos, ya que los he omitido y no he visto resultados negativos. (... todavía)

1

Otro enfoque más es crear el menú en la raíz de ActivityGroup y luego usar public boolean onPrepareOptionsMenu (menú Menú) para borrar y volver a agregar elementos de menú.

En la clase ActivityGroup:

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    //what is the current activity? 
    menu.add(0, 0, 0, "holder"); 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    //start a new 
    menu.clear(); 
    //add some menu options 
    .getLocalActivityManager().getCurrentActivity().onPrepareOptionsMenu(menu); 
    return super.onPrepareOptionsMenu(menu); 
} 

En Actividad:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ //add menus or inflate here 
    return true; 
} 
2

Necesita anular los métodos de menú en el grupo de actividad, y llamar a los métodos correspondientes en la actividad infantil Ver este artículo: How to Create Options Menu on Child Activity inside an ActivityGroup

public class TestGroup extends ActivityGroup { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     //start child activity 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     return getLocalActivityManager().getCurrentActivity().onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onMenuItemSelected(int featureId, MenuItem item) { 
     return getLocalActivityManager().getCurrentActivity().onMenuItemSelected(featureId, item); 
    } 
} 
2

uso este código en el tabGroupActivity

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    // TODO Auto-generated method stub 


    return getLocalActivityManager().getCurrentActivity().onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    // TODO Auto-generated method stub 
    return getLocalActivityManager().getCurrentActivity().onMenuItemSelected(featureId, item); 
} 

utilizar el código que figura a continuación en ambos 2 niños Actividades

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.menu_1, menu); 
    return true; 
}// menu_1 is the xml file in menu folder 
@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.weekly: 
     Intent weekly = new Intent(getParent(),Activity1.class); 
     TabGroupActivity parentActivity = (TabGroupActivity)getParent(); 
     parentActivity.startChildActivity("weeklyview", weekly); 

     break; 

    case R.id.daily : 
     Intent daily = new Intent(getParent(),Activity2.class); 
     TabGroupActivity parentActivity2 = (TabGroupActivity)getParent(); 
     parentActivity2.startChildActivity("daily", daily); 
     break; 

    default: 
     break; 
    } 

    //use return true 
return true; 
} 
Cuestiones relacionadas