83 votes

Fragment onOptionsItemSelected pas être appelé

J'ai ajouté une action de la barre de menu option de partage pour mon fragment qui apparaît, mais l'événement de sélection n'est pas pris

Je suis ajoutant des comme ça

    @Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater)
{
    MenuItem item = menu.add(0, 7,0, R.string.share);
    item.setIcon(R.drawable.social_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}

D'essayer de le capturer à la fois le fragment et le fragment d'activité comme

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case 7:
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("text/plain");
            share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!");
            startActivity(Intent.createChooser(share, "Share Text"));
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

et j'ai setHasOptionsMenu(true); dans le onCreate()

145voto

Felixqk Points 749

Même problème m'est arrivé:

onMenuItemSelected événements n'est pas appelée dans le Fragment

Une recherche google cann pas trouver une solution, et ajouter onMenuItemSelected méthode dans FragmentActivity ne pas le résoudre.

Enfin le résoudre par la suite de référence pour http://developer.android.com/guide/topics/ui/actionbar.html

Remarque: Si vous avez ajouté l'élément de menu à partir d'un fragment, via le Fragment de la classe onCreateOptionsMenu rappel, le système des appels respectifs onOptionsItemSelected() méthode pour l'fragment lorsque l'utilisateur sélectionne l'un des fragment de la éléments. Cependant, l'activité obtient une chance de traiter le cas de la première, de sorte que le système des appels onOptionsItemSelected() sur l'activité avant d'appeler la même fonction de rappel pour le fragment.

Ce qui signifie que si vous n'avez pas d'élément de menu gestionnaire de onOptionsItemSelected() sur l'activité, la onOptionsItemSelected() sur le fragment sera appelée.

Le Code suivant -----Supprimer le gestionnaire de R. d'action.ajouter sur FragmentActivity):

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            popBackStack();             
            return true;        
        case R.id.action_search:
            searchAction();
            return true;
        case R.id.action_logout:
            userLogout();
            return true;
        //case R.id.action_add:
            //return true;    
        default:
            return super.onOptionsItemSelected(item);
    }   
}

Et le gestionnaire de R. d'action.ajouter sur Fragment ressemble à ceci:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    Log.d("onOptionsItemSelected","yes");
    switch (item.getItemId()) {
        case R.id.action_add:
            add();
            return true;    
        default:
            return super.onOptionsItemSelected(item);
    }
}

Enfin, n'oubliez pas d'ajouter

    setHasOptionsMenu(true);

dans votre méthode onCreate du Fragment

131voto

Marco HC Points 983

J'ai eu le même problème, mais je pense que c'est mieux de résumer et de présenter la dernière étape pour le faire fonctionner:

  1. Ajouter setHasOptionsMenu(vrai) méthode dans votre Fragment de la onCreate(Bundle savedInstanceState) méthode.

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

  3. À l'intérieur de votre onOptionsItemSelected(MenuItem item) de l'Activité de méthode, assurez-vous de retourner la valeur false lorsque l'élément de menu d'action serait mis en œuvre en onOptionsItemSelected(MenuItem item) Fragment de la méthode.

Un exemple:

L'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 ce sera utile.

Des acclamations.

2voto

user1634451 Points 969

Edit pour actionbar sherlock utilisation

J'ai eu à utiliser

public boolean onMenuItemSelected(int featureId, MenuItem item) {

l'activité principale de capturer l'élément de menu

2voto

okkko Points 11

Je suis en utilisant actionbarsherlock. Cela a fonctionné pour moi:

1) Créer dummy_menu.xml menu

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="fill_parent" >
<item
      android:title=""
      android:showAsAction="never"
      android:id="@+id/dummyMenu"
        />

2) Dans l'activité de gonfler le menu comme ceci:

@Override
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
   inflater.inflate(R.menu.dummy_menu,menu);
   return super.onCreateOptionsMenu(menu);
}

3) Dans les fragments onCreateView appel setHasOptionsMenu(vrai) et remplacer onCreateOptionsMenu et onOptionsItemSelected également masquer les dummyMenu comme ceci (fragment)

    @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.fragment_actions, menu);
    MenuItem item = menu.findItem(R.id.dummyMenu);
    item.setVisible(false);
    super.onCreateOptionsMenu(menu, inflater);
}

Espérons que cela aide quelqu'un.

0voto

Barrie Galitzky Points 176

J'ai eu ce problème. C'était parce que j'étais overiding la mauvaise méthode

onOptionsItemSelected(com.actionbarsherlock.vue.MenuItem item) est ce que j'ai utilisé.

Assurez-vous d'utiliser la bonne!

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