2016-05-01 15 views
0

Ich möchte ein Kontextmenü auf einigen MenuItems meiner Navigationsleiste öffnen (um dynamisch erstellte Listen von Elementen anzuzeigen, aus denen ausgewählt werden kann). Aber ich kann nicht herausfinden, welche Ansicht für registerForContextMenu zu verwenden, noch weiß ich, welche Ansicht manuell an openContextMenu übergeben werden (z. B. wenn das Kontextmenü auch mit einem einzigen Klick angezeigt werden soll). Die Verwendung der MenuItem-Kennung funktioniert nicht, da sie nicht in eine Ansicht umgewandelt werden kann. Wie kann ich hier ein Kontextmenü verwenden?Wie erstelle ich ein Kontextmenü auf einem MenuItem einer Navigationsleiste?

+0

Ist das eine Art von Hausaufgaben/App? Ich habe die genau gleiche Frage vor nicht allzu langer Zeit gesehen. Ich gebe Ihnen den gleichen Rat, den ich bei der anderen Frage gegeben habe, überdenken Sie Ihre Logik: Sie sollten eigentlich keine Kontextmenüs für Menüeinträge starten, da dies nicht die große Mehrheit der Benutzer erwarten würde. – Luksprog

+0

Ich habe Nutzer gesehen, die dasselbe über Aktionsleisten-Menüelemente diskutieren, also warum sollten Sie nicht dasselbe für Schubladenmenüelemente in Betracht ziehen? Wenn man bedenkt, dass nicht jeder, der sich entwickelt, ein ausgewachsener Android-Experte ist (und manche sogar versuchen, besser zu werden, indem sie an einer "echten" App statt an einer Hausaufgabe arbeiten), könnten Sie konkretere Vorschläge machen Ansätze dienen hier? Ich habe versucht, Untermenüs zu verwenden, aber soweit ich das durch das Lesen von mehreren Beiträgen verstehe, kann ich sie nicht einfach aufblasen/wieder aufblasen, so dass mein Menü in der Schublade mit ständig geöffneten Untermenüs unhandlich wird. – urps

+0

Ich empfehle es dagegen, weil es nicht das ist, wofür das Widget erstellt wurde (wie die Navigation durch Ihre App und keine willkürlichen Inhalte wie ContextMenu anzuzeigen). Stattdessen würde ich aus den wenigen Informationen, die Sie zur Verfügung gestellt haben, empfehlen, die NavigationView durch eine ExpandableListView zu ersetzen, auf diese Weise haben Sie die "Hauptoptionen" (Ihre aktuellen Menüoptionen) und wenn der Benutzer auf diese klickt, zeigen Sie die Kindansichten (Ihre Datenlisten) darunter, die der Art und Weise, wie Sie die Daten anzeigen, eine gewisse Struktur verleihen. – Luksprog

Antwort

0

Eine Möglichkeit, dies zu erreichen, besteht darin, das gesamte NavigationView für das Kontextmenü zu registrieren und zu verfolgen, welches menuItem ausgewählt wurde, indem es in einer internen Membervariable gespeichert wird, bevor ein Objekt manuell angeklickt wird openContextMenu auf der NavigationView. Dann ist es möglich, onCreateContextMenu nur für diejenigen MenuItems zu implementieren, für die ich eigentlich das Kontextmenü benötige.

Insbesondere registrieren ich die Schublade für Kontextmenü wie folgt aus:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.top_menu, menu); 
    NavigationView nav_draw = (NavigationView) findViewById(R.id.nav_view); 
    if (nav_draw != null) { 
     registerForContextMenu(nav_draw); 
    } 
    return true; 
} 

stelle ich eine Membervariable

private MenuItem _lastNavDrawerMenuItemSelected = null; 

, die ich bei null zu halten, wenn keine der „interessanten“ Menüpunkte ausgewählt sind, sonst speichere ich darin den aufrufenden Menüpunkt und öffne das Kontextmenü manuell:

Ich

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    if (v.getId() == R.id.nav_view) { 
     if (_lastNavDrawerMenuItemSelected != null) { 
      if (_lastNavDrawerMenuItemSelected.getItemId() == R.id.my_submenu_item_id) { 
       menu.setHeaderTitle(...); 
       menu.add(v.getId(),_lastNavDrawerMenuItemSelected.getItemId(), Menu.NONE, <ENTRY TITLE>); 
       ... 
      } 
      _lastNavDrawerMenuItemSelected = null; 
     } 
    } 
} 

Schließlich:

In onCreateContextMenu stelle ich sicher, dass nur die gewünschten MenuItems behandelt erhalten, weitergeben die ID der NavigationView und aktuelle MenuItem als groupId und itemId, und stellen Sie die interne Membervariable null zurück implementieren die notwendigen Maßnahmen auf der Grundlage groupId (die ich den NavigationView oben gesetzt) ​​und itemId (die ich das MenuItem gesetzt, für die das Kontextmenü gebaut wurde):

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    if (item.getGroupId() == R.id.nav_view) { 
     if (item.getItemId() == R.id.my_submenu_item_id) { 
      ... 
     } 
    } 
    return true; 
} 
Verwandte Themen