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

Как сделать панель контекстного ActionMode наложением панели инструментов appcompat-v7, но не ящиком навигации?

У меня есть активность с панелью приложений и навигационным ящиком. Панель приложений реализована с использованием нового класса панели инструментов из библиотеки apcompat-v7 версии 21. +, а перед ним отображается навигационный ящик.

Активность содержит представление списка с элементами, которые можно выбрать, поэтому я показываю контекстную панель действий (CAB). Он запускается путем вызова:

ActionBarActivity.startSupportActionMode(android.support.v7.view.ActionMode.Callback callback)

По умолчанию CAB вставлен над панелью инструментов вместо наложения на нее; кажется, что CAB по умолчанию будет перекрывать истинный ActionBar. Как показано в этом ответе, CAB правильно накладывает панель инструментов, когда установлено это свойство темы:

<item name="windowActionModeOverlay">true</item>

Но это также делает CAB наложением навигационного ящика, что неверно в соответствии с спецификациями дизайна материалов. Основной дизайн Android docs по-прежнему рекомендуют скрывать CAB при открытии ящика навигации и показывая его снова при закрытии и это можно было бы сделать, чтобы "исправить" проблему, но это не обязательно. Как указано, спецификации материалов не указывают, что CAB должен быть скрыт при открытии ящика навигации, и потому, что навигационный ящик должен открываться над CAB, скрытие CAB на самом деле будет визуальным отвлечением.

Есть ли способ отобразить навигационный ящик перед CAB, но при этом он накладывает панель инструментов?

4b9b3361

Ответ 1

Я мог бы найти решение - или, возможно, простой обходной путь.
У меня была такая же проблема даже с ListFragment, когда startActionMode() использовался вместо встроенного setChoiceMode(). Поэтому я просмотрел код ListFragment, и я обнаружил, что startActionMode() не вызывается в отношении активности, а скорее в ListView, поэтому я попытался использовать представление. В моем коде теперь он работает, как ожидается, используя либо фрагмент ListView:

ActionMode mActionMode = getListView().startActionMode(this);

или с помощью контейнера Activity, который содержит мой фрагмент:

View aView = getActivity().findViewById(R.id.container);
ActionMode mActionMode = aView.startActionMode(this);

также:

  • теперь кнопка "Назад" уничтожает режим действия, пока до этого не было
  • CAB теперь правильно закрывает панель действий, в то время как использование windowActionModeOverlay в моем стиле охватывало только ее часть - по крайней мере, в моем случае
  • Значок CAB - это стрелка назад, а не галочка - не уверен, что это означает, но

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