Как реализовать контекстное меню в ListActivity на Android?

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


person pupeno    schedule 11.01.2009    source источник
comment
Ваше изменение фактически полностью изменило вопрос. Наверное, лучше было бы просто задать другой вопрос.   -  person Reto Meier    schedule 14.01.2009


Ответы (2)


В методе onCreate вызовите registerForContextMenu нравится:

registerForContextMenu(getListView());

а затем заполните меню на onCreateContextMenu (меню ContextMenu, представление View, ContextMenuInfo menuInfo). Аргумент 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);
person pupeno    schedule 12.01.2009
comment
Ах, спасибо. Искал это по всей сети, но смог найти только старую версию. Этот идеально подходит для кексов. - person e-satis; 23.04.2009
comment
Я знаю, что код защиты ClassCastException присутствует в образце Google, но я думаю, что это, вероятно, не нужно. Маловероятно, что MenuInfo только иногда может быть AdapterContextMenuInfo - вероятно, так будет всегда или никогда не будет. Предложение guard предотвращает сбой приложения, но в любом случае у вас есть логическая ошибка. Лично я бы предпочел увидеть всю трассировку стека, но это только мое предпочтение. - person Daniel Yankowsky; 20.07.2009
comment
@ Даниэль Янковский: Если вы используете registerForContextMenu только один раз: да. Но с настраиваемым макетом списка действий у вас могут быть и другие элементы для регистрации. Но тогда: не лучше ли использовать instanceof и проверить, что у вас есть? - Ааа, хорошего демонстрационного кода я никогда не видел. - person Martin; 05.06.2011

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

person Romain Guy    schedule 13.01.2009