Чтобы использовать новую контекстную панель действий , см. « Включение режима контекстного действия для отдельных представлений ».
В нем говорится:
Если вы хотите вызвать контекстный режим действия только тогда, когда пользователь выбирает конкретный
просмотров, вы должны:
- Реализация интерфейса
<a href="http://developer.android.com/reference/android/view/ActionMode.Callback.html" rel="noreferrer">ActionMode.Callback</a>
. В его методах обратного вызова вы
может задавать действия для контекстной панели действий, реагировать на события щелчков на элементах действий и обрабатывать другие события жизненного цикла для режима действий.
- Позвоните
<a href="http://developer.android.com/reference/android/app/Activity.html#startActionMode(android.view.ActionMode.Callback)" rel="noreferrer">startActionMode()</a>
, когда вы хотите показать
панель (например, когда пользователь долго нажимает на вид).
Например:
- Реализация интерфейса
<a href="http://developer.android.com/reference/android/view/ActionMode.Callback.html" rel="noreferrer">ActionMode.Callback</a>
:
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;
}
};
Обратите внимание, что эти обратные вызовы событий практически идентичны обратным вызовам для меню параметров, за исключением того, что каждый из них также передает объект <a href="http://developer.android.com//reference/android/view/ActionMode.html" rel="noreferrer">ActionMode</a>
, связанный с событием. Вы можете использовать <a href="http://developer.android.com//reference/android/view/ActionMode.html" rel="noreferrer">ActionMode</a>
API для внесения различных изменений в CAB, таких как изменение заголовка и
субтитры с <a href="http://developer.android.com/reference/android/view/ActionMode.html#setTitle(int)" rel="noreferrer">setTitle()</a>
и <a href="http://developer.android.com/reference/android/view/ActionMode.html#setSubtitle(int)" rel="noreferrer">setSubtitle()</a>
(полезно, чтобы указать, сколько предметов
выбран).
Также обратите внимание, что приведенный выше пример устанавливает переменную mActionMode
в ноль, когда
Режим действия разрушен. На следующем шаге вы увидите, как он инициализируется и как сохраняется
переменная-член в вашей деятельности или фрагмент может быть полезна.
- Позвоните
<a href="http://developer.android.com/reference/android/app/Activity.html#startActionMode(android.view.ActionMode.Callback)" rel="noreferrer">startActionMode()</a>
, чтобы включить контекстную
режим действия, когда это необходимо, например, в ответ на длинный щелчок по <a href="http://developer.android.com/reference/android/view/View.html" rel="noreferrer">View</a>
:
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;
}
});
Когда вы звоните <a href="http://developer.android.com/reference/android/app/Activity.html#startActionMode(android.view.ActionMode.Callback)" rel="noreferrer">startActionMode()</a>
, система возвращает
<a href="http://developer.android.com/reference/android/view/ActionMode.html" rel="noreferrer">ActionMode</a>
создано. Сохраняя это в переменной члена, вы можете
внести изменения в контекстную панель действий в ответ на другие события. В приведенном выше примере
<a href="http://developer.android.com/reference/android/view/ActionMode.html" rel="noreferrer">ActionMode</a>
используется для гарантии того, что экземпляр <a href="http://developer.android.com/reference/android/view/ActionMode.html" rel="noreferrer">ActionMode</a>
не воссоздается, если он уже активен, проверяя, является ли элемент нулевым, перед запуском
режим действия.
Включение пакетных контекстных действий в ListView или GridView
Если у вас есть коллекция предметов в <a href="http://developer.android.com/reference/android/widget/ListView.html" rel="noreferrer">ListView</a>
или <a href="http://developer.android.com/reference/android/widget/GridView.html" rel="noreferrer">GridView</a>
(или другое расширение <a href="http://developer.android.com/reference/android/widget/AbsListView.html" rel="noreferrer">AbsListView</a>
) и вы хотите
чтобы пользователи могли выполнять пакетные действия, необходимо:
Например:
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 <code><a href="/reference/android/view/ActionMode.html#invalidate()">invalidate()</a></code> request
return false;
}
});
Вот и все. Теперь, когда пользователь выбирает элемент длинным щелчком, система вызывает <a href="http://developer.android.com/reference/android/view/ActionMode.Callback.html#onCreateActionMode(android.view.ActionMode,%20android.view.Menu)" rel="noreferrer">onCreateActionMode()</a>
метод и отображает контекстную панель действий с указанными действиями. Хотя контекстная
Панель действий видна, пользователи могут выбирать дополнительные элементы.
В некоторых случаях, когда контекстные действия предоставляют общие элементы действий, вы можете
хотите добавить флажок или аналогичный элемент пользовательского интерфейса, который позволяет пользователям выбирать элементы, потому что они
может не обнаружить поведение длинного щелчка. Когда пользователь устанавливает флажок, вы
может вызвать контекстный режим действия, установив соответствующий элемент списка
состояние с <a href="http://developer.android.com/reference/android/widget/AbsListView.html#setItemChecked(int,%20boolean)" rel="noreferrer">setItemChecked()</a>
.