В этом посте мы хотим проанализировать контекстное меню ( контекстную панель действий ). Это меню, которое относится к конкретному пункту. Контекстное меню может быть применено почти ко всем представлениям, но обычно оно используется с 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).