Как вызвать поведение ActionBar, похожее на ContextMenu?

Например, в Android 3.0, когда вы выбираете какой-либо текст, панель действий переключается в режим, подобный ContextMenu, который позволяет вам выполнять действия с выделенным текстом: копировать/поделиться/и т. д., а слева появляется кнопка «Готово». чтобы пользователь мог выйти из этого режима.

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


person Zsombor Erdődy-Nagy    schedule 28.05.2011    source источник


Ответы (3)


Да, я тоже не смог найти — пришлось спрашивать в Google I|O.

Используйте startActionMode(). Вот один из их примеров это демонстрирует. Мне самой нужно больше работать в этой области.

person CommonsWare    schedule 28.05.2011
comment
Вау, теперь это хорошо скрытая функция. Спасибо! - person Zsombor Erdődy-Nagy; 29.05.2011
comment
это только я или вызов этого не работает должным образом с MultiChoiceModeListener? Кажется, когда я использую это в своей деятельности, обратный вызов onItemCheckedStateChanged никогда не выполняется. Остальные методы ActionMode.Callback вызываются, как и ожидалось. - person powerj1984; 18.06.2014
comment
Используйте [startSupportActionMode (ActionMode.Callback callback)](developer.android.com/reference/android/support/v7/app/ для проектов appcompat. - person Gavin; 19.06.2014
comment
@CommonsWare У меня похожая проблема с вызовом CAB с использованием startSupportActionMode для списка RecyclerView. Я был бы признателен за любую помощь или идеи, которые вы могли бы предоставить, здесь: stackoverflow.com/questions/47406498/ - person AJW; 22.11.2017

введите здесь описание изображения

Чтобы использовать новую контекстную панель действий, см. "Включение режима контекстных действий для отдельных представлений". Говорится:

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

  1. Реализуйте интерфейс ActionMode.Callback. В его методах обратного вызова вы можете указать действия для контекстной панели действий, реагировать на события щелчка по элементам действия и обрабатывать другие события жизненного цикла для режима действия.
  2. Вызовите startActionMode(), когда вы хотите отобразить панель (например, когда пользователь долго щелкает представление).

Например:

  1. 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 задается нулевым значением, когда режим действия уничтожается. На следующем шаге вы увидите, как он инициализируется и как может быть полезным сохранение переменной-члена в вашей активности или фрагменте.

  2. 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) и вы хотите разрешить пользователям выполнять пакетные действия, вам следует:

  • Реализуйте интерфейс AbsListView.MultiChoiceModeListener и установите его для группы просмотра с setMultiChoiceModeListener(). В методах обратного вызова слушателя вы можете указать действия для контекстной панели действий, реагировать на события щелчка по элементам действий и обрабатывать другие обратные вызовы, унаследованные от интерфейса ActionMode.Callback.
  • Вызовите setChoiceMode() с аргументом CHOICE_MODE_MULTIPLE_MODAL.

Например:

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
comment
Считается ли приемлемым просто копировать содержимое официальной документации в ответ? Оригинальный контент находится под лицензией Creative Commons, но авторство здесь недостаточно ясно. - person murrayc; 06.06.2014

Может быть, немного поздно, но вот руководство для режима действия: http://www.vogella.com/articles/AndroidListView/article.html#listview_actionbar

person Tobias    schedule 16.08.2012