В этом посте мы хотим проанализировать контекстное меню ( контекстную панель действий ). Это меню, которое относится к конкретному пункту. Контекстное меню может быть применено почти ко всем представлениям, но обычно оно используется с ListView . Мы много говорим о представлении списка, потому что это один из самых важных компонентов. Мы можем выделить два разных типа контекстного меню:
- Плавающее меню
- Режим контекстного действия (ActionMode)
Плавающее меню используется с версией Android ниже 3.0 (уровень API 11). По сути, это меню, которое появляется, когда пользователь долго нажимает на элемент ListView. Ты сможешь
найти пример здесь . Это похоже на изображение, показанное ниже:
Режим контекстного действия представлен в Android 3.0 или более поздней версии и представляет собой контекстную панель, которая появляется вверху, когда пользователь долго нажимает на элемент . Согласно руководствам Android, этот вид меню лучше, чем плавающее меню. В этом посте мы хотим проанализировать, как мы можем создать это меню.
Создать контекстное действие Режим: Определить интерфейс ActionMode.CallBack
Чтобы создать контекстное меню, мы должны сначала определить интерфейс ActionMode.CallBack. Этот интерфейс вызывается, когда пользователь долго нажимает на элемент ListView. Код выглядит так:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
private ActionMode.Callback modeCallBack = new ActionMode.Callback() { public boolean onPrepareActionMode(ActionMode mode, Menu menu) return false; } public void onDestroyActionMode(ActionMode mode) { mode = null; } public boolean onCreateActionMode(ActionMode mode, Menu menu) { return true; } public boolean onActionItemClicked(ActionMode mode, MenuItem item) { }}; |
Мы заинтересованы в строке 11 и строке 15. Первая — это то, где мы создадим нашу контекстную панель действий в верхней части экрана, а в строке 15 мы обрабатываем логику, когда пользователь выбирает один из наших пунктов меню.
Первое, что мы должны сделать, это создать наше меню. Для простоты мы можем предположить, что у нас есть только два пункта меню, а затем мы определяем файл в res / menu с именем Activity_main.xml :
|
1
2
3
4
5
6
7
8
|
<item android:id="@+id/edit" android:icon="@android:drawable/ic_menu_edit"/> <item android:id="@+id/delete" android:icon="@android:drawable/ic_menu_delete"/></menu> |
Теперь у нас есть наше меню, и нам просто нужно «вставить» его в
Метод onCreateActionMode .
|
1
2
3
4
5
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) { mode.setTitle("Options"); mode.getMenuInflater().inflate(R.menu.activity_main, menu); return true;} |
Теперь мы должны показать эту контекстную панель действий, когда пользователь долго нажимает на элемент.
ActionMode и длинный щелчок: onItemLongClickListener
Если мы хотим показать эту контекстную панель при длинных щелчках пользователя, мы просто установили прослушиватель в нашем ListView, который мы вызываем lv в исходном коде. Итак, мы имеем:
|
1
2
3
4
5
6
7
8
|
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { public boolean onItemLongClick (AdapterView parent, View view, int position, long id) { System.out.println("Long click"); startActionMode(modeCallBack); view.setSelected(true); return true; }}); |
В строке 4 мы просто запускаем контекстное меню, используя метод startActionMode . Теперь результат:
Как вы можете видеть в верхней части, у нас есть контекстная панель действий.
Выбор пункта контекстного меню
Теперь давайте предположим, что пользователь нажимает на элемент меню. Как мы справимся с этим событием? Хорошо, если мы вернемся к ActionMode.CallBack, мы должны реализовать другой метод onActionItemClicked . Итак, мы имеем:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.delete: { aAdpt.remove( aAdpt.getItem(aAdpt.currentSelection) ); mode.finish(); break; } case R.id.edit: { System.out.println(" edit "); break; } default: return false;} |
В строке 6 мы просто удаляем из нашего адаптера выбранный элемент. Чтобы узнать положение выбранного элемента внутри ListView, мы сохраняем его в методе OnItemLongClickListener .
|
1
|
aAdpt.currentSelection = position; |
Когда мы закончим обработку выбора пункта пользовательского меню, мы должны закрыть контекстную панель действий callig mode.finish (строка 7).

