2009-01-11 27 views

Respuesta

73

En la llamada al método onCreate registerForContextMenu así:

registerForContextMenu(getListView()); 

y luego pueblan el menú de onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo). El argumento menuInfo puede proporcionar información sobre lo que se ha hecho clic largo artículo de esta manera:

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

y añadir elementos de menú en la forma usual llamar menu.add:

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

y cuando el usuario elige una opción , Se llama onContextItemSelected. También onMenuItemSelected y este hecho no se explica explícitamente en la documentación, excepto para decir que utiliza el otro método para recibir llamadas desde el menú contextual; solo ten en cuenta que no compartas identificadores.

En onContextItemSelected puede ponerme en contacto con el MenuInfo y por lo tanto la identificación del elemento seleccionado llamando 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, gracias. He estado buscando eso en toda la Web, pero solo pude encontrar la versión anterior. Este funciona perfecto con cupcake. –

+2

Sé que el código de protección ClassCastException aparece en la muestra de Google, pero creo que probablemente sea innecesario. No es probable que el MenuInfo sea a veces un AdapterContextMenuInfo, probablemente siempre o nunca. La cláusula de guardia evita que la aplicación se cuelgue, pero de todos modos tienes un error lógico. Personalmente preferiría ver toda la pila, pero esa es solo mi preferencia. –

+1

@Daniel Yankowsky: si usa 'registerForContextMenu' solo una vez: sí. Pero con un diseño de actividad de lista personalizada, es posible que tenga otros elementos para registrarse también. Pero entonces: ¿No sería mejor usar 'instanceof' y verificar lo que obtuviste? - Ahh, bueno, nunca he visto un buen código de demostración. – 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; 
} 
Cuestiones relacionadas