onCreateOptionsMenu in Fragmenten


182

Ich habe setHasOptionsMenu(true)drinnen platziert onCreateView, kann aber immer noch keine onCreateOptionsMenuFragmente aufrufen .

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
                         Bundle savedInstanceState) {   
   setHasOptionsMenu(true);             
   return inflater.inflate(R.layout.facesheet, container, false);
}

Unten ist mein onCreateOptionsMenuCode.

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

Die Fehlermeldung, die ich bekomme:

Die Methode onCreateOptionsMenu(Menu)vom Typ Fragment muss eine Supertypmethode überschreiben oder implementieren.


1
Danke für das 'setHasOptionsMenu (true);', das habe ich gesucht.
Fabricio PH

Antworten:


496

Versuche dies,

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

Und in onCreatediese Zeile hinzufügen , die Optionen in Ihrem erscheinen zu lassenToolbar

setHasOptionsMenu(true);

182
Es wird nicht aufgerufen, wenn Sie diese Zeile nicht hinzufügen:setHasOptionsMenu(true);
Yoann Hercouet

10
onCreateOptionsMenu () für Fragmente hat andere Argumente als für Aktivitäten.
Jorge

3
und auch ein anderer Rückgabetyp als void im Gegensatz zum Booleschen Wert von onCreateOptionsMenu () in der oben genannten Aktivität.
Dexter

4
Interessanter Hinweis: Wenn Sie in Ihrer enthaltenen Aktivität auch onCreateOptionsMenu überschreiben, werden beide Optionsmenüelemente angezeigt.
Adam Johns

5
setHasOptionsMenu(true);muss aufgerufen werden onCreate(), um vollständig zu sein.
Roel

21

Sie haben bereits die automatisch generierte Datei res / menu / menu.xml , die action_settings definiert .

In Ihrer MainActivity.java haben Sie die folgenden Methoden:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_settings:
            // do stuff, like showing settings fragment
            return true;
    }

    return super.onOptionsItemSelected(item); // important line
}

In der onCreateView()Methode Ihres Fragment-Aufrufs:

setHasOptionsMenu(true); 

und fügen Sie auch diese 2 Methoden hinzu:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case R.id.action_1:
            // do stuff
            return true;

        case R.id.action_2:
            // do more stuff
            return true;
    }

    return false;
}

Fügen Sie abschließend die neue Datei res / menu / fragment_menu.xml hinzu , die action_1 und action_2 definiert .

Wenn Ihre App das Fragment anzeigt, enthält das Menü auf diese Weise 3 Einträge:

  • action_1 aus res / menu / fragment_menu.xml
  • action_2 aus res / menu / fragment_menu.xml
  • action_settings aus res / menu / menu.xml

1
Die Frage war in Fragmenten, nicht Aktivität
OlivierM

2
@OlivierM Die Antwort erklärt das Fragment-Menü. Ich schätze die Erklärung, wie es mit dem Aktivitätsmenü interagiert.
Aranda

13

Ich habe die Antworten von @Alexander Farber und @Sino Raj ausprobiert. Beide Antworten sind nett, aber ich konnte das onCreateOptionsMenu in meinem Fragment nicht verwenden, bis ich herausfinde, was fehlte:

Fügen Sie setSupportActionBar (Symbolleiste) wie folgt zu meiner Aktivität hinzu:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.id.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

Ich hoffe, diese Antwort kann für jemanden mit dem gleichen Problem hilfreich sein.


4

Anruf

setSupportActionBar(toolbar)

Innerhalb

onViewCreated(...) 

des Fragments

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);
    ((MainActivity)getActivity()).setSupportActionBar(toolbar);
    setHasOptionsMenu(true);
}

1
 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_add_customer, container, false);
        setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_sample, menu);
    super.onCreateOptionsMenu(menu,inflater);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.