2009-01-11 5 views

Répondre

73

Sur l'appel registerForContextMenu comme méthode onCreate ceci:

registerForContextMenu(getListView()); 

puis renseigner le menu sur onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo). L'argument menuInfo peut fournir des informations sur quel élément a été long cliqué ainsi:

AdapterView.AdapterContextMenuInfo info; 
try { 
    info = (AdapterView.AdapterContextMenuInfo) menuInfo; 
} catch (ClassCastException e) { 
    Log.e(TAG, "bad menuInfo", e); 
    return; 
} 
long id = getListAdapter().getItemId(info.position); 

et vous ajoutez des éléments de menu de la manière habituelle appeler menu.add:

menu.add(0, MENU_ITEM_ID, 0, R.string.menu_string); 

et lorsque l'utilisateur choisit une option , onContextItemSelected est appelée. Aussi onMenuItemSelected et ce fait n'est pas explicitement expliqué dans la documentation sauf pour dire que vous utilisez l'autre méthode pour recevoir les appels depuis le menu contextuel; Sache juste, ne partage pas les ids.

Sur onContextItemSelected vous pouvez obtenir Ahold du MenuInfo et donc l'identifiant de l'élément sélectionné en appelant getMenuInfo():

try { 
    info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
} catch (ClassCastException e) { 
    Log.e(TAG, "bad menuInfo", e); 
    return false; 
} 
long id = getListAdapter().getItemId(info.position); 
+1

Ahh, merci. Été à la recherche de tout cela sur le Web, mais ne pouvait trouver que l'ancienne version. Celui-ci fonctionne parfaitement avec cupcake. –

+2

Je sais que le code de garde ClassCastException apparaît dans l'exemple de Google, mais je pense que c'est probablement inutile. Il est peu probable que le MenuInfo soit seulement parfois un AdapterContextMenuInfo - il sera probablement toujours ou jamais. La clause de garde empêche l'application de s'écraser, mais vous avez un bug de logique de toute façon. Personnellement, je préférerais voir toute la trace de la pile, mais c'est juste ma préférence. –

+1

@Daniel Yankowsky: Si vous utilisez 'registerForContextMenu' qu'une seule fois: oui. Mais avec une disposition d'activité de liste personnalisée, vous pouvez également avoir d'autres éléments à enregistrer. Mais alors: ne serait-il pas mieux d'utiliser 'instanceof 'et de vérifier ce que vous avez? - Ah, eh bien, je n'ai jamais vu de bon code de démo. – Martin

5
listView = (ListView) findViewById(R.id.listpockets); 
registerForContextMenu(listView); 



public void onCreateContextMenu(android.view.ContextMenu menu, View v, android.view.ContextMenu.ContextMenuInfo menuInfo) { 
    //AdapterContextMenuInfo info = (AdapterContextMenuInfo)menuInfo; 
    menu.setHeaderTitle(getString(R.string.titleDelete)); 
    menu.add(0, CommonUtil.CONTEXT_MENU__DELETE_ID, 0, getString(R.string.menuDelete)); 
}; 
@Override 
public boolean onContextItemSelected(MenuItem item) { 

    if(item.getItemId() == CommonUtil.CONTEXT_MENU__DELETE_ID) 
    { 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     long id = this.listView.getItemIdAtPosition(info.position); 
     Log.d(TAG, "Item ID at POSITION:"+id); 
    } 
    else 
    { 
     return false; 
    } 
    return true; 
} 
Questions connexes