Как реализовать контекстное меню в ListActivity на Android? - PullRequest
39 голосов
/ 12 января 2009

Как реализовать контекстное меню, вызываемое длинным щелчком или касанием ListActivity, использующего встроенные макеты и ListAdapter?

Ответы [ 3 ]

74 голосов
/ 12 января 2009

При вызове метода onCreate registerForContextMenu , например:

registerForContextMenu(getListView());

и затем заполните меню в onCreateContextMenu (меню ContextMenu, представление View, менюInfo ContextMenuInfo) . Аргумент menuInfo может предоставить информацию о том, по какому элементу долго нажимали, таким образом:

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

и вы добавляете пункты меню обычным способом, вызывая menu.add :

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

и когда пользователь выбирает опцию, вызывается onContextItemSelected . Также onMenuItemSelected , и этот факт явно не объясняется в документации, за исключением того, что вы используете другой метод для получения вызовов из контекстного меню; просто знайте, не делитесь идентификаторами.

В onContextItemSelected вы можете получить доступ к MenuInfo и, следовательно, к идентификатору элемента, выбранного с помощью вызова getMenuInfo () :

try {
    info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
} catch (ClassCastException e) {
    Log.e(TAG, "bad menuInfo", e);
    return false;
}
long id = getListAdapter().getItemId(info.position);
14 голосов
/ 13 января 2009

Вам также следует взглянуть на Activity.registerForContextMenu (Просмотреть) .

5 голосов
/ 31 декабря 2011
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;
}
...