2017-01-10 18 views
2

Ich verwende den folgenden Code, um onCreateContextMenu zu generieren, jedoch erhalte ich keine Antwort, wenn ich auf einen Listeneintrag klicke.onCreateContextMenu wird nicht aufgerufen

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenu.ContextMenuInfo menuInfo) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
    int currentId = (int) info.id; 
    menu.add(0, MENU_DELETE_ID, 0, "Delete"); 
} 

Ich werde currentId verwenden später, aber der obige Code nicht Ergebnisse in einem Pop-Up mit dem Wort Delete drin.

Konnte es, weil ich eine benutzerdefinierte AdapterView verwende, die in this answer zu meiner vorherigen Frage gezeigt wird? Auch meine MainActivity verlängert AppCompatActivity, wenn das zählt.

Ich habe andere Fragen geprüft wie diese onCreateContextMenu isn't being called aber ich bin nicht mit onItemLongClickListener

Antwort

3

Es gibt nicht genug Code zu verstehen, was hier eigentlich los ist. Aber ich könnte einige häufige Fehler vorschlagen, die bei der Implementierung der ContextMenu berücksichtigt werden müssen.

Sie müssen zuerst das Kontextmenü registrieren. Von der Entwickler Dokumentation ein Kontextmenü Erstellen -

Wenn Ihre Aktivität verwendet ein ListView oder GridView und Sie möchten jedes Element zu den gleichen Kontextmenü zur Verfügung stellen, registrieren Sie alle Elemente für ein Kontextmenü durch die ListView vorbei oder GridView bis registerForContextMenu().

Sie könnten also in Betracht ziehen, etwas in Ihrer onCreate Funktion Ihrer ListActivity zu tun.

registerForContextMenu(getListView()); 

Und ich sehe keine MenuInflater in Ihrem onCreateContextMenu. Sie müssen die Ansicht beim Erstellen des Kontextmenüs aufblähen.

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
           ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu, menu); 
} 

Aus der Dokumentation

MenuInflater können Sie über das Kontextmenü aus einem Menü Ressource aufzublasen. Zu den Parametern der Callback-Methode gehören View, die der Benutzer ausgewählt hat, und ein ContextMenu.ContextMenuInfo-Objekt, das zusätzliche Informationen zu dem ausgewählten Element bereitstellt. Wenn Ihre Aktivität mehrere Ansichten hat, die jeweils ein anderes Kontextmenü enthalten, können Sie mit diesen Parametern ermitteln, welches Kontextmenü aufgeklappt werden soll.

Und Sie müssen möglicherweise einen Long-Klick-Listener für Ihre Listenelemente implementieren. Es scheint nur mit Long-Click-Events zu funktionieren.

Wenn die registrierte Ansicht, die ein langfris Click-Ereignis empfängt, ruft das System Ihre onCreateContextMenu() Methode. Hier definieren Sie das Menü Elemente, normalerweise durch Aufblasen einer Menüressource.

Hier gehen Sie für die volle implementation documentation. Ich hoffe, das hilft!

aktualisieren

Wenn Sie nicht ListActivity verwenden, sollten Sie nicht in der Lage sein getListView zu nennen. Übergeben Sie in diesem Fall einfach die ListView Referenz, während Sie Ihr Kontextmenü für Ihre Liste registrieren.

ListView lv = (ListView) findViewById(R.id.my_list); 
registerForContextMenu(lv); 
+0

'getListView()' kann nur verwendet werden, wenn Ihre Tätigkeit 'ListAcitivty' erstreckt, wenn ich mich nicht irre. Also, da ich es nicht nennen kann, bedeutet das, dass ich 'onCreateContextMenu()' nicht benutzen kann? – Leb

+0

Bitte beachten Sie die aktualisierte Antwort und akzeptieren und Upvote, wenn hilfreich. –

+1

Vielen Dank, dass Sie sich die Zeit genommen haben und dabei geholfen haben. – Leb