Android совместимость контекстная панель действий - PullRequest
25 голосов
/ 02 марта 2012

Пытаясь следовать Руководству по дизайну Android, я сталкиваюсь с небольшим затруднением.

Я хочу получить список элементов, по которым я могу долго нажимать несколько из (множественный выбор), изатем выполните массовые действия над ними.

В Руководстве по проектированию предлагается использовать для этого контекстную панель действий, и это звучит совершенно так, как я задумал.Проблема в том, что я пытаюсь поддерживать совместимость в обратном направлении к API 7 (из-за того, что мой телефон сейчас 2.3.3).

Я использую ActionBarSherlock , чтобы получить другие элементы панели действий, но я не могу понять, как заставить его запустить контекстную панель действий, и при этом я не понялкак добавить кнопки произвольно в панель действий в ABS.Я вижу, вы можете делать вкладки, так что, возможно, это ответ, но так как я пытаюсь разрешить множественный выбор, я не хочу иметь нормальное модальное контекстное меню.

Ответы [ 6 ]

22 голосов
/ 20 сентября 2012

Это поздний ответ, но я думаю, что он поможет людям застрять.

Открытие контекстной панели действий на самом деле довольно просто, в любой момент вашей деятельности вам просто нужно позвонить:

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" />

16 голосов
/ 13 марта 2012

Настройка контекстной панели действий аналогична настройке «обычных» элементов ActionBar в том, что касается XML. Этот пример в руководстве разработчика объясняет все это .

Чтобы использовать ActionBarSherlock, замените обратные вызовы Android по умолчанию на отредактированные обратные вызовы ActionBarSherlock (например, вместо Android.View.ActionMode используйте com.actionbarsherlock.view.ActionMode).

2 голосов
/ 06 мая 2013

ActionBarSherlock имеет собственную реализацию ActionMode, но вам придется вручную управлять его жизненным циклом, я написал учебник об этом.

1 голос
/ 04 марта 2012

Для примера длинного клика, пожалуйста, обратитесь к ссылкам ниже. Первый - это Java-код, необходимый для примера. И второе, как определить макет;

0 голосов
/ 22 марта 2012

Я столкнулся с той же проблемой.Это было решено, когда я нашел эту ссылку .По сути, вы должны создать класс обратного вызова, который реализует ActionMode.Callback.В этом классе вы надуваете панель действий своей контекстной панелью действий.При каждом выборе (или длительном щелчке) вы запускаете обратный вызов, используя метод startActionMode.См. Ссылку для рабочего кода =]

РЕДАКТИРОВАТЬ: Существует также пример на образцах Шерлока под /samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java

0 голосов
/ 04 марта 2012

Я отвечу на вторую часть вашего вопроса. Вот пример того, как добавить любую панель действий экземпляра 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);
}
...