![введите здесь описание изображения](https://i.stack.imgur.com/FnI5K.png)
Чтобы использовать новую контекстную панель действий, см. "Включение режима контекстных действий для отдельных представлений". Говорится:
Если вы хотите вызывать режим контекстных действий только тогда, когда пользователь выбирает определенные представления, вам следует:
- Реализуйте интерфейс
ActionMode.Callback
. В его методах обратного вызова вы можете указать действия для контекстной панели действий, реагировать на события щелчка по элементам действия и обрабатывать другие события жизненного цикла для режима действия.
- Вызовите
startActionMode()
, когда вы хотите отобразить панель (например, когда пользователь долго щелкает представление).
Например:
- Implement the
ActionMode.Callback
interface:
private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
// Called when the action mode is created; startActionMode() was called
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate a menu resource providing context menu items
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
return true;
}
// Called each time the action mode is shown. Always called after onCreateActionMode, but
// may be called multiple times if the mode is invalidated.
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false; // Return false if nothing is done
}
// Called when the user selects a contextual menu item
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_share:
shareCurrentItem();
mode.finish(); // Action picked, so close the CAB
return true;
default:
return false;
}
}
// Called when the user exits the action mode
@Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
}
};
Обратите внимание, что эти обратные вызовы событий почти такие же, как обратные вызовы для меню параметров, за исключением того, что каждый из них также передает объект ActionMode
, связанный с событием. Вы можете использовать ActionMode
API для внесения различных изменений в CAB, например, изменить заголовок и подзаголовок с помощью setTitle()
и setSubtitle()
(полезно указать, сколько элементов выбрано).
Также обратите внимание, что в приведенном выше примере переменная mActionMode
задается нулевым значением, когда режим действия уничтожается. На следующем шаге вы увидите, как он инициализируется и как может быть полезным сохранение переменной-члена в вашей активности или фрагменте.
- Call
startActionMode()
to enable the contextual
action mode when appropriate, such as in response to a long-click on a View
:
someView.setOnLongClickListener(new View.OnLongClickListener() {
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
if (mActionMode != null) {
return false;
}
// Start the CAB using the ActionMode.Callback defined above
mActionMode = getActivity().startActionMode(mActionModeCallback);
view.setSelected(true);
return true;
}
});
При вызове startActionMode()
система возвращает созданный ActionMode
. Сохранив это в переменной-члене, вы можете вносить изменения в контекстную панель действий в ответ на другие события. В приведенном выше примере ActionMode
используется для предотвращения повторного создания экземпляра ActionMode
, если он уже активен, путем проверки того, является ли член нулевым перед запуском режима действия.
Enabling batch contextual actions in a ListView or GridView
Если у вас есть коллекция элементов в ListView
или GridView
(или другое расширение AbsListView
) и вы хотите разрешить пользователям выполнять пакетные действия, вам следует:
Например:
ListView listView = getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
// Here you can do something when items are selected/de-selected,
// such as update the title in the CAB
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// Respond to clicks on the actions in the CAB
switch (item.getItemId()) {
case R.id.menu_delete:
deleteSelectedItems();
mode.finish(); // Action picked, so close the CAB
return true;
default:
return false;
}
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// Inflate the menu for the CAB
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.context, menu);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// Here you can make any necessary updates to the activity when
// the CAB is removed. By default, selected items are deselected/unchecked.
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// Here you can perform updates to the CAB due to
// an invalidate()
request
return false;
}
});
Вот и все. Теперь, когда пользователь выбирает элемент долгим кликом, система вызывает метод onCreateActionMode()
и отображает контекстную панель действий с указанными действиями. Пока отображается контекстная панель действий, пользователи могут выбирать дополнительные элементы.
В некоторых случаях, когда контекстные действия предоставляют общие элементы действий, вы можете добавить флажок или аналогичный элемент пользовательского интерфейса, который позволяет пользователям выбирать элементы, поскольку они могут не обнаружить поведение долгого щелчка. Когда пользователь устанавливает флажок, вы можете вызвать режим контекстных действий, установив соответствующий элемент списка в отмеченное состояние с помощью setItemChecked()
.
person
Jeff Axelrod
schedule
30.09.2012