2012-07-07 9 views
7

Ich hatte ein Problem beim Einrichten einiger Fragment Menüelemente in der ActionBar und ich fand einen Weg, um es zu lösen, aber ich verstehe nicht, warum es funktioniert hat.Verwenden von onPrepareOptionsMenu anstelle von onCreateOptionsMenu in Fragment

Ich wollte die Sichtbarkeit in einem Menüelement direkt ändern, nachdem ich es aus einer Menü-XML-Datei in onCreateOptionsMenu Methode aufgebläht habe. Der Code scheint gut zu funktionieren, aber es gibt keinen sichtbaren Effekt. Ich löste das Problem, das Menü in onCreateOptionsMenu Methode aufzublasen, aber die Sichtbarkeit davon in onPrepareOptionsMenu Methode zu ändern.

Ich möchte wissen, warum das Ändern der Sichtbarkeit in onCreateOptionsMenu nicht funktioniert.

Was kann ich in onPrepareOptionsMenu tun, dass ich in onCreateOptionsMenu nicht tun kann?

Gibt es ein Muster, um hier zu folgen?

Danke!

Hier ist der entsprechende Code, nur für den Fall:

public class MyFragment extends Fragment { 

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

     // This does not work, compiles and runs fine, but has no visible effect 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 

    @Override 
    public void onPrepareOptionsMenu(Menu menu) { 
     super.onPrepareOptionsMenu(menu); 

     // This does work 
     MenuItem someMenuItem = menu.findItem(R.id.some_menu_item); 
     someMenuItem.setVisible(false); 
    } 
} 
+1

Ich bin nicht sicher, aber die [Dokumentation] (http://developer.android.com/reference/android/app/Activity. html # onCreateOptionsMenu (android.view.Menu)) sagt: "_ ... Um das Menü jedes Mal zu aktualisieren, wenn es angezeigt wird, siehe [onPrepareOptionsMenu (Menü)] (http://developer.android.com/reference/android/app/ Activity.html # onPrepareOptionsMenu (android.view.Menu)) ._ " –

+1

Danke für den Kommentar! Die Sache hier ist, ich muss es nicht jedes Mal aktualisieren "(es wird ständig angezeigt, es gibt keine Untermenüs), ich möchte nur das Menü nur einmal konfigurieren, wenn erstellt/aufgeblasen und das ist alles . Gut, es mag in meiner Situation das Gleiche zu sein scheinen, aber der Punkt meiner Frage ist zu verstehen, warum es so funktioniert. Warum muss ich das Menü jedes Mal neu konfigurieren, wenn ich es nur einmal beim Erstellen erstelle? –

+0

Ich verstehe und stimme zu, dass sollte eine Option sein. Meiner Meinung nach ist es aber so, wie Android funktioniert. In einigen Fällen können Sie die Eigenschaften des Menüs mit XML-Attributen fest codieren. –

Antwort

5

Sie sollten super.onCreateOptionsMenu(menu, inflater); aufrufen, nachdem Sie Ihr Menü erstellt haben, nicht vorher. Dadurch wird das Menü in der Hierarchie nach oben verschoben, und andere Fragmente oder Aktivitäten können Elemente selbst hinzufügen.

Die Aktivität ist für die Anzeige und Verwaltung des Menüs verantwortlich. Wenn Sie also die Sichtbarkeit ändern, nachdem sie an die Aktivität gesendet wurde, passiert nicht viel.

Jetzt, wenn Sie super.onPrepareOptionsMenu(menu); anrufen, wird es sein Menü "vorbereiten", aber es wird jetzt die Änderungen übernehmen, die Sie in der onCreateOptionsMenu berücksichtigt haben. Diese

+1

nice - entferne diese Zeile, weil du Recht hast "_Ich denke das_" – Elltz

+0

Fertig- danke für die Bestätigung. – Christian

0

kann der Code sein sollte true zurückgeben das Menü sichtbar zu machen, bedeutet, dass Sie return true; Aussage sowohl in onCreateOptionsMenu() und onPrepareOptionsMenu() setzen sollte.

Hoffe, das hilft.

+5

onCreateOptionsMenu gibt void zurück – Axarydax

+1

Tatsächlich gibt es zwei onPrepareOptions() Methoden. Die [erste] (http://developer.android.com/reference/android/app/Activity.html#onPrepareOptionsMenu (android.view.Menu)), für die Activity-Klasse, gibt einen Wert zurück - wenn True nicht ist zurückgegeben, wird das Menü nicht angezeigt. Die [Fragment] (http://developer.android.com/reference/android/app/Fragment.html#onPrepareOptionsMenu (android.view.Menu)) Version nicht. Die Fragment-Version benötigt API 11 und API 1 für die Aktivitätsversion. Art von interessant. – fattire

0

Ich verwende das onPrepareOptionsMenu, um zu aktualisieren, welche Elemente im Menü aktiv sein sollen und welche abhängig vom aktuellen Status der Aktivität ausgegraut/entfernt werden sollen. Verwenden Sie die setVisible-Methode des Menüelements, um zu steuern, ob sie derzeit im Menü angezeigt wird oder nicht.

-2

funktioniert für mich

public class ContentFragment extends android.support.v4.app.Fragment { 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.content_frame,container,false); 
    setHasOptionsMenu(true); 
    return v; 
} 

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

Probieren Sie es

+0

Dieses Ding funktioniert für mich, aber ich möchte wissen, wie man die Methode invalidateoptionsmenu() für die dynamische Änderung verwendet –

+0

Wenn es Code für die dynamische Menüaktualisierung gibt, dann lass es mich wissen. –

Verwandte Themen