Статьи

Контекстное меню Android ListView: ActionMode.CallBack

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

Справка: контекстное меню Android ListView: ActionMode.CallBack от нашего партнера по JCG Франческо Аццолы из блога Surviving w / Android .