41 votes

Le fragment ne reçoit pas les rappels du menu

J'ai une classe de fragment qui étend Fragment et appelle setHasOptionsMenu pour participer au menu. Cette classe implémente également onCreateOptionsMenu , onPrepareOptionsMenu y onOptionsItemSelected .

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        ....
}

Je charge dynamiquement ce fragment à l'aide d'un fichier FragmentTransaction dans mon activité (qui étend FragmentActivity ).

Cependant, aucun des rappels du menu ( onCreateOptionsMenu , onPrepareOptionsMenu y onOptionsItemSelected ) sont appelés (j'ai débogué avec des points d'arrêt dans ces méthodes) et le menu n'est pas affiché.

Est-ce que j'ai manqué quelque chose ? Dois-je ajouter quelque chose dans mon activité ?

J'utilise la bibliothèque de compatibilité Android, je compile avec le SDK L11 et je teste dans une Xoom.

EDITAR : J'ai trouvé le problème. Mon AndroidManifest cible L11, ce qui semble cacher le bouton de menu et empêcher les callbacks d'être appelés. Cependant, si je retire ce bouton du manifeste, je perds d'autres fonctionnalités dont j'ai besoin (par exemple l'état activé dans les listes). Est-ce que quelqu'un sait comment résoudre ce problème (activer le bouton de menu) sans supprimer l'option de l'AndroidManifest ? targetSdkVersion=11 du Manifeste ?

29voto

user553456 Points 251

Aromero, N'oubliez pas de surcharger le onCreateOptionsMenu en utilisant la version fragmentée de la méthode, comme ceci :

    @Override
    public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.queue_options, menu);
        super.onCreateOptionsMenu(menu, inflater);
    }

Cela va dans le fragment, d'ailleurs, et s'ajoute au menu gonflé de l'activité, s'il y en a un. J'ai eu le même problème moi-même, jusqu'à ce que je trouve cette solution.

Kim

9voto

Catherine Darrow Points 221

Si vous rencontrez ce problème avec ActionBarSherlock, vous devez vous assurer que vos fragments sont des SherlockFragments, et non de simples SupportFragments, et que ce que vous surchargez est

public void onPrepareOptionsMenu (com.actionbarsherlock.view.Menu menu) {

PAS

public void onPrepareOptionsMenu (android.view.Menu menu) {

Dans ce dernier cas, vous devriez recevoir une sorte d'avertissement indiquant que la fonction est finale et que vous ne pouvez pas la remplacer. Il s'agit d'un avertissement indiquant que vous essayez de remplacer la mauvaise fonction !

Si vous corrigez l'erreur en changeant la classe de SherlockFragment en un simple Fragment, vous pouvez créer la fonction mais elle ne sera pas appelée.

9voto

Marco HC Points 983

J'ai eu le même problème, mais je pense qu'il est préférable de résumer et d'introduire la dernière étape pour le faire fonctionner :

  1. Ajoutez la méthode setHasOptionsMenu(true) dans l'interface de votre fragment. onCreate(Bundle savedInstanceState) méthode.

  2. Remplacer onCreateOptionsMenu(Menu menu, MenuInflater inflater) (si vous voulez faire quelque chose de différent dans le menu de votre fragment) et onOptionsItemSelected(MenuItem item) dans votre fragment.

  3. Dans votre onOptionsItemSelected(MenuItem item) assurez-vous de renvoyer false lorsque l'action de l'élément de menu serait mise en œuvre dans la méthode de l'activité onOptionsItemSelected(MenuItem item) Méthode du fragment.

Un exemple :

Activité

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.activity_menu_item:
        // Do Activity menu item stuff here
        return true;
    case R.id.fragment_menu_item:
        // Not implemented here
        return false;
    default:
        break;
    }

    return false;
}

Fragment

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    ....
}

@Override
public void onCreateOptionsMenu(Menu menu) {
    // Do something that differs the Activity's menu here
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.activity_menu_item:
        // Not implemented here
        return false;
    case R.id.fragment_menu_item:
        // Do Fragment menu item stuff here
        return true;
    default:
        break;
    }

    return false;
}

J'espère que cela vous sera utile.

A la vôtre.

6voto

Error 454 Points 4121

Si vous disposez d'une activité et d'un fragment qui chargent chacun des éléments de menu, vous devez faire particulièrement attention aux surcharges que vous utilisez.

Les activités peuvent passer outre onOptionsItemSelected y onMenuItemSelected Cependant, les fragments peuvent uniquement remplacer onOptionsItemSelected .

Si vous passez outre onMenuItemSelected dans votre activité et onOptionsItemSelected dans votre fragment, votre fragment override ne sera jamais déclenché.

Au lieu de cela, utilisez onOptionsItemSelected à la fois en activité et en fragment.

5voto

Nelson Ramirez Points 3364

Vous devez vous assurer que vous appelez setHasOptionsMenu(true); onCreate o onCreateView est appelé dans votre fragment.

Vous devez également implémenter la surcharge de onCreateOptionsMenu à l'intérieur de votre fragment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X