Подтвердить что ты не робот

Панель контекстного действия для Android-совместимости

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

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

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

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

4b9b3361

Ответ 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