2010-07-01 6 views
6

J'ai un problème en utilisant ActivityGroup. J'ai deux activités à l'intérieur d'un ActivityGroup et les deux utilisent un menu (remplaçant onCreateOptionMenu et onOptionsItemSelected). Eh bien, le problème est que la deuxième activité dans le groupe n'affiche pas le menu lorsque j'appuie sur la touche de menu. La première activité fonctionne bien montrant le menu.Android ActivityGroup Menu Problème

Une idée de ce problème?

Je possède ce code dans l'activité de l'enfant:

@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

Je pense que ce comportement est étonnant de seconde activité. Essayez de sélectionner n'importe quel contrôle actuellement sur la 2ème activité, puis appuyez sur le bouton de menu. Menu apparaîtra, mais je ne sais pas pourquoi. –

+0

J'ai le même problème, je reçois le même menu pour la deuxième activité aussi. même j'ai un menu distinct définir pour la deuxième activité. S'il vous plaît laissez-moi savoir comment résoudre ce problème – Sam

Répondre

1

filets.Vérifier this.

de menu peut être manipulé dans le parent aactivity, mais créé chez l'enfant activité

+0

ok mais comment puis-je invoquer une méthode de l'activité enfant si je gère le menu dans l'activité parent? – xger86x

+0

@ xger86x: C'est le problème. Vous devez gérer le menu dans une activité enfant, pas dans celle du parent. – Macarse

+0

@macarse ok alors ... comment je fais ça? Comprenez-vous ma question? Si je dois invoquer une méthode sur l'activité enfant je ne peux pas du parent. – xger86x

7

Une autre belle façon de traiter c'est à l'aide du LocalActivityManager ActivityGroup. Obtenez le responsable de l'activité locale, obtenir l'activité en cours, et effectuer la méthode appropriée de cette activité:

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

Note: en utilisant cette stratégie, vous ne devez pas appeler super.onCreateOptionsMenu de l'enfant activité- Ceci peut causer une exception de débordement de pile . Je ne suis pas sûr du but de l'appel des méthodes de la superclasse, comme je les ai omis et n'ai vu aucun résultat négatif. (encore ...)

1

Encore une autre approche consiste à créer le menu dans la racine ActivityGroup, puis à utiliser public boolean onPrepareOptionsMenu (menu Menu) pour effacer et rajouter des éléments de menu.

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

En activité:

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

Vous devez remplacer les méthodes de menu dans le groupe d'activité, et appeler les méthodes correspondantes sur l'activité de l'enfant. Voir cet article: 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

utiliser ce code sur le 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); 
} 

utiliser le code qui donne ci-après dans les deux 2 enfants Activités

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