Панель контекстного действия для Android-совместимости
Пытаясь следовать рекомендациям по разработке Android, я столкнулся с небольшим затруднением.
Я хочу иметь список элементов, которые я могу долго нажать несколько (multi-select), а затем выполнить массовые действия над ними.
В Руководстве по дизайну предлагается использовать контекстную панель действий для этого, и это звучит совершенно так, как я имел в виду. Проблема в том, что я пытаюсь поддерживать совместимость в обратном направлении до API 7 (из-за моего телефона в настоящее время 2.3.3).
Я использую ActionBarSherlock, чтобы получить другие файлы, но я не могу понять, как заставить его запускать контекстную панель действий, и я не понял, как добавьте кнопки произвольно в ActionBar в ABS. Я вижу, что вы можете делать вкладки, так что, возможно, это ответ, но поскольку я пытаюсь разрешить многоэкранный выбор, я не хочу иметь обычное модальное контекстное меню.
Ответы
Ответ 1
Настройка контекстной панели действий одинакова для настройки "обычных" элементов ActionBar в отношении XML. Этот пример в руководстве разработчика объясняет все это.
Чтобы использовать ActionBarSherlock, замените обратные вызовы Android по умолчанию на обработанные ActionBarSherlock обратные вызовы (например, вместо Android.View.ActionMode
, используйте com.actionbarsherlock.view.ActionMode
).
Ответ 2
Это поздний ответ, но я думаю, что это поможет людям застрять.
Открытие контекстной панели действий на самом деле довольно просто, в любой момент вашей деятельности вам просто нужно позвонить:
startActionMode(mActionModeCallback);
Если вы не находитесь в своем основном действии, например, в фрагментах, вы можете получить ссылку с помощью
getSherlockActivity().startActionMode(mActionModeCallback);
и это обратный вызов
private ActionMode.Callback mActionModeCallback = new ActionMode.Callback(){
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
MenuInflater inflater = mode.getMenuInflater();
inflater.inflate(R.menu.actionbar_context_menu, menu);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item1:
return true;
case R.id.menu_item2:
//close the action mode
//mode.finish();
return true;
default:
mode.finish();
return false;
}
}
};
xml - это простое меню, например, панель действий:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_item1"
android:icon="@drawable/ic_item1"
android:title="@string/ITEM1"
android:showAsAction="always|withText" />
<item android:id="@+id/menu_item2"
android:icon="@drawable/ic_item2"
android:title="@string/ITEM2"
android:showAsAction="always|withText" />
Ответ 3
ActionBarSherlock имеет собственную реализацию ActionMode, но вам придется вручную управлять его жизненным циклом, я написал учебник об этом.
Ответ 4
Для длинного щелчка нажмите ссылку ниже. Первый - это Java-код, необходимый для образца. И второе - определение макета;
Ответ 5
Я отвечу на вторую часть вашего вопроса. Ниже приведен пример того, как добавить любую панель действия View (кнопка в коде ниже) в библиотеку ActionBarSherlock:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
refreshButton = (RotatingButton) LayoutInflater.from(this).inflate(R.layout.actionbar_customview_refresh, null);
refreshButton.setOnClickListener(refreshButtonListener);
MenuItem item = menu.add(0, android.R.id.copy, 0, getString(R.string.actionbar_refresh));
item.setActionView(refreshButton);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_action_bar, menu);
}
Ответ 6
Я столкнулся с той же проблемой. Это было решено, когда я нашел эту ссылку. В принципе, вам нужно создать класс обратного вызова, который реализует ActionMode.Callback
. В этом классе вы надуваете панель действий своей контекстной панелью действий. При каждом выборе (или длительном щелчке) вы начинаете обратный вызов с помощью метода startActionMode
. См. Ссылку для рабочего кода =]
РЕДАКТИРОВАТЬ: В примерах Шерлока также есть пример /samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java