Как вызвать ActionMar-поведение, подобное ContextMenu? - PullRequest
16 голосов
/ 28 мая 2011

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

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

Ответы [ 3 ]

32 голосов
/ 01 октября 2012

enter image description here

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

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

  1. Реализация интерфейса <a href="http://developer.android.com/reference/android/view/ActionMode.Callback.html" rel="noreferrer">ActionMode.Callback</a>. В его методах обратного вызова вы может задавать действия для контекстной панели действий, реагировать на события щелчков на элементах действий и обрабатывать другие события жизненного цикла для режима действий.
  2. Позвоните <a href="http://developer.android.com/reference/android/app/Activity.html#startActionMode(android.view.ActionMode.Callback)" rel="noreferrer">startActionMode()</a>, когда вы хотите показать панель (например, когда пользователь долго нажимает на вид).

Например:

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

  2. Позвоните <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() {

    &#64;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
    }

    &#64;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;
        }
    }

    &#64;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;
    }

    &#64;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.
    }

    &#64;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>.

17 голосов
/ 28 мая 2011

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

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

5 голосов
/ 16 августа 2012

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

...