wake-up-neo.com

(Veraltet) Fragment onOptionsItemSelected wird nicht aufgerufen

EDIT: Diese Frage war für die veraltete Sherlock-Aktionsleiste. Stattdessen sollte jetzt die Android-Unterstützungsbibliothek verwendet werden

Ich habe eine Aktionsleisten-Menüoption namens share für meine fragment hinzugefügt, die angezeigt wird, aber das Auswahlereignis nicht erfasst wird 

Ich füge es so hinzu

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

Versuchen, es in der Variablen fragment und fragment activity zu erfassen

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

und ich habe setHasOptionsMenu(true); in der onCreate().

80
user1634451

Bearbeiten für Actionbar-Sherlock-Verwendung

Musste ich verwenden 

public boolean onMenuItemSelected(int featureId, MenuItem item) {

in der Hauptaktivität, um den Menüpunkt zu erfassen 

2
user1634451

Gleiche Probleme sind mir passiert: 

onMenuItemSelected-Ereignisse wurden in Fragment nicht aufgerufen

Google hat keine Lösung gefunden und die Methode onMenuItemSelected in FragmentActivity kann nicht gefunden werden.

Lösen Sie es schließlich, indem Sie dem Verweis auf http://developer.Android.com/guide/topics/ui/actionbar.html folgen.

Hinweis: Wenn Sie das Menüelement über den onCreateOptionsMenu-Callback der Fragment-Klasse aus einem Fragment hinzugefügt haben, ruft das System die jeweilige onOptionsItemSelected () - Methode für dieses Fragment auf, wenn der Benutzer eines der Elemente des Fragments auswählt. Die Aktivität hat jedoch eine Chance, das Ereignis zuerst zu behandeln, daher ruft das System onOptionsItemSelected () für die Aktivität auf, bevor der gleiche Rückruf für das Fragment aufgerufen wird.

Das heißt, nur wenn Sie diesen Menüelement-Handler nicht in onOptionsItemSelected () für die Aktivität haben, wird das onOptionsItemSelected () im Fragment aufgerufen.

Code wie folgt ----- Entfernen Sie den Handler für R.action.add in 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);
    }   
}

Der Handler für R.action.add auf Fragment sieht folgendermaßen aus:

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

Denken Sie schließlich daran, hinzuzufügen 

    setHasOptionsMenu(true);

in Ihrer onCreate-Methode in Fragment

145
Felixqk

Ich hatte das gleiche Problem, aber ich denke, es ist besser, den letzten Schritt zusammenzufassen und einzuführen, damit es funktioniert:

  1. Fügen Sie die setHasOptionsMenu(true)-Methode zur onCreate(Bundle savedInstanceState)-Methode Ihres Fragments hinzu.

  2. Überschreiben Sie onCreateOptionsMenu(Menu menu, MenuInflater inflater) (wenn Sie im Menü Ihres Fragments etwas anderes tun möchten) und onOptionsItemSelected(MenuItem item)-Methoden in Ihrem Fragment.

  3. Stellen Sie in der onOptionsItemSelected(MenuItem item)-Methode Ihrer Activity sicher, dass Sie false zurückgeben, wenn die Menüelementaktion in der onOptionsItemSelected(MenuItem item)-Methode von Fragment implementiert wird.

Ein Beispiel:

Aktivität

@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, MenuInflater inflater) {
    // 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;
}
125
Marco HC

Ich habe bemerkt, dass die Lösung, die die Leute Ihnen gaben, darin bestand, den Code für Ihr Menüelement in der Aktivität und nicht im Fragment zu implementieren. Ich denke, es wird viel orgenisierter aussehen, wenn Sie den Code im Fragment und nicht in der Aktivität implementiert hätten 'cos sieht meiner Meinung nach besser aus .. Gehen Sie dazu wie folgt vor:

Aktivität

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu, menu);      
        return true;
    }

 @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {            
        switch (item.getItemId())
        {
            case R.id.SomeIDInTheMenueOfTheActivity:
            {
               //something();
                break;
            }
            default:
             //do something default and add the code under : 
             return super.onOptionsItemSelected(item);
        }
        return true;
    }

Fragment

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

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

     @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            switch (item.getItemId())
            {           
                case R.id.SomeIDInFragmentMenue:
                {             
                    break;
                }

                default:
                    return super.onOptionsItemSelected(item);
            }

            return true;
        }

Jetzt die Zeilen (und dergleichen): "return super.onOptionsItemSelected (item);" In der Aktivität und im Fragment ist das extrem wichtig, denn wenn Sie dem Code in debug folgen, werden Sie feststellen, dass die Menüereignisfunktionen zuerst in der Aktivität aufgerufen werden und wenn das Element nicht mit den IDs in der Aktivitätsoption der Aktivität übereinstimmt. Fall die Degault-Zeile: "super.onOptionsItemSelected (item);" ruft die onOptionsItemSelected-Funktion für das Fragment auf, wie wir wollten ... (wenn Sie viele Fragmente haben, stellen Sie sicher, dass diese Zeile auch in ihnen enthalten ist, da die aufrufende Hirarchie etwas kompliziert sein kann).

5
Malfonde

es ist so einfach, dass Sie dies in Ihrem Fragment tun können, um sicherzustellen, dass Ihre Aktion richtig zuhört:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}
2
Mohamed Hussien

Ich verwende Actionbarsherlock. Das hat für mich funktioniert:

1) Erstellen Sie das dummy_menu.xml-Menü

<?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) In Aktivität das Menü wie folgt aufblasen:

@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) In Fragmenten onCreateView rufen Sie setHasOptionsMenu (true) auf und überschreiben Sie onCreateOptionsMenu und onOptionsItemSelected.

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

Hoffe es hilft jemandem.

2
okkko

Ich hatte dieses Problem. Es war, weil ich die falsche Methode überschritt

onOptionsItemSelected (com.actionbarsherlock.view.MenuItem-Element) ist das, was ich verwendet habe.

Stellen Sie sicher, dass Sie das richtige verwenden!

0
Barrie Galitzky

sie müssen diesen Code toolbar.bringToFront(); als nächstes in Ihre Aktivität einfügen

 public class MainActivity extends AppCompatActivity {
     protected void onCreate(Bundle savedInstanceState) {
        ...

        Toolbar toolbar = findViewById(R.id.toolbar);
        toolbar.setTitle("Yazd");
        setSupportActionBar(toolbar);
        toolbar.bringToFront(); // <<= add here
         ...
0
Mahdi Afkhami

Sie sind in den Aktivitätsmethoden nicht mit der Superklasse verkettet. Bitte haben Sie onCreateOptionsMenu () return super.onCreateOptionsMenu (Menü) und onOptionsItemSelected () return super.onOptionsItemSelected (item) (außer dem Element, das Sie behandeln, und das true zurückgeben soll, um anzuzeigen, dass Sie das Ereignis behandelt haben).

0
Divyesh Murani