2010-07-01 16 views
6

Ho un problema con ActivityGroup. Ho due attività all'interno di un ActivityGroup e entrambi usano un menu (sovrascrivendo onCreateOptionMenu e onOptionsItemSelected).Menu attività Android Menu Problema

Bene, il problema è che la seconda attività nel gruppo non mostra il menu quando premo il tasto Menu. La prima attività funziona bene mostrando il menu.

Qualche idea su questo problema?

Ho questo codice nell'attività bambino:

@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

Credo che questo sia un comportamento sorprendente di secondo attività. Prova a selezionare qualsiasi controllo al momento su 2a attività e quindi premi il pulsante menu. Apparirà il menu, ma non so perché. –

+0

Sto avendo lo stesso problema sto ricevendo lo stesso menu anche per la seconda attività. anche io ho un menu separato definire per la seconda attività. per favore fatemi sapere come risolvere questo problema – Sam

risposta

1

Controllare this thread.

del menu può essere gestito nel genitore aactivity, ma ha creato nel bambino attività

+0

ok ma come posso invocare un metodo dell'attività figlio se gestisco il menu nell'attività padre? – xger86x

+0

@ xger86x: questo è il problema. Dovresti gestire il menu in un'attività figlio non in quella genitore. – Macarse

+0

@macarse ok così .... come faccio? capisci la mia domanda? Se devo invocare un metodo sull'attività figlio che non posso dal genitore .. – xger86x

7

Un altro bel modo di gestire questo è quello di utilizzare LocalActivityManager del ActivityGroup. Prendi il responsabile attività locale, ottenere l'attività corrente, ed eseguire il metodo appropriato che di attività:

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: usando questa strategia, non si deve chiamare super.onCreateOptionsMenu dal bambino attività- facendo causa così un'eccezione di overflow dello stack . Non sono sicuro di quale sia lo scopo di chiamare i metodi della superclasse *, poiché li ho omessi e non ho visto risultati negativi. (... ancora)

1

Un altro approccio è quello di creare il menu nella root di ActivityGroup e quindi utilizzare public booleano onPrepareOptionsMenu (menu Menu) per cancellare e riaggiungere le voci di menu.

In classe 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); 
} 

in attività:

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

È necessario eseguire l'override dei metodi di menu nel gruppo di attività, e chiamare i metodi corrispondenti sull'attività del bambino. Si veda questo articolo: 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 di questo codice sul 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); 
} 

utilizzare il codice che riporta di seguito in entrambi i 2 bambini Attività

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