Панель инструментов и контекстный ActionBar с AppCompat-v7
Я работаю над использованием недавно добавленной панели инструментов, которая была представлена в Lollipop и в библиотеке AppCompat-v7. Я выполнил это руководство по настройке панели инструментов. Я заметил, что когда вы вызываете что-то, что вызовет контекстный ActionBar (например, выделение текста для копирования/вставки), это будет нажимать панель инструментов на странице. Вы можете видеть, о чем я говорю в изображении внизу страницы:
Итак, по сути, я настроил это так. У меня есть панель инструментов, определенная в XML файле, который я использую с тегами include:
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"/>
Затем я создаю его на мой взгляд:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/root"
tools:context=".MainActivity">
<include
layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!-- Rest of view -->
</LinearLayout>
В коде я установил его так:
// On Create method of activity:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Кто-нибудь знает, как сделать так, чтобы контекстный ActionBar появился поверх панели инструментов?
![Toolbar and Contextual ActionBar]()
Ответы
Ответ 1
Update:
Решение: используйте свойство windowActionModeOverlay. Задайте это в своей теме:
<item name="windowActionModeOverlay">true</item>
и действие будет показано над панелью действий, а не нажатием. (Если вы не используете последний AppCompat, вам нужно добавить префикс "android:" в свойство). Это в основном позволяет AppCompat знать, что у вас есть панель инструментов, расположенная в верхней части экрана, и что она должна рисовать ActionMode поверх нее.
Старый ответ/обход:
Я столкнулся с той же проблемой. Независимо от того, какую тему я устанавливаю, он всегда отталкивает панель инструментов, которую я установил как ActionBar. Я пробовал с и без поддержки библиотеки, но это не имело значения.
К сожалению, я не смог его исправить, поэтому вместо этого я создал обходное решение. В моем ActionModeCallback
onCreateActionMode
я скрою панель действий:
actionBarToolbar.setVisibility(View.GONE);
и в onDestroyActionMode
Я снова показываю:
actionBarToolbar.setVisibility(View.VISIBLE);
Скрытие/показ происходит так быстро, что это не заметно на моих тестовых устройствах. Конечно, недостаток: хотя анимация ввода все еще работает, анимация выхода контекстной панели действий теряется, потому что панель инструментов сразу же всплывает над ней. Но пока мы не встретим лучшее решение, я думаю, мы застряли в этом.
(My Activity фактически расширяет пользовательский класс BaseActivity
, который имеет метод под названием getActionBarToolbar()
, взятый из исходного кода приложения Google I/O 2014, поэтому я могу легко получить панель инструментов:
BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);
Слишком плохо, что приложение ввода-вывода не использует контекстную панель действий.)
Ответ 2
Не запускайте его в своей деятельности, а на панели инструментов. В вашей деятельности:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)
и вы должны использовать
<item name="windowActionModeOverlay">true</item>
Ответ 3
Просто небольшое дополнение:
Для
<item name="windowActionModeOverlay">true</item>
для работы важно вызвать super.onCreate(savedInstanceState)
ПЕРЕД вызовом setContentView(R.layout.your_activity)
в вашей деятельности.
Это действительно имеет значение в этом случае!
Ответ 4
В моем случае,
<item name="windowActionModeOverlay">true</item>
не работает,
но эта работа: <item name="android:windowActionModeOverlay">true</item>
, ключ android
- это ключ.
Ответ 5
Решение Jacob работало для меня, но контекстный ActionBar был прозрачным, и панель инструментов была видна через него. Это можно решить следующим образом:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
....
....
<item name="actionModeStyle">@style/CustomActionMode</item>
</style>
<style name="CustomActionMode" parent="@style/Widget.AppCompat.ActionMode">
<item name="background">@color/primary_material_light</item>
</style>
Тема "AppTheme.Base" должна быть той, что была применена к панели инструментов.
Подробнее о контекстном стиле ActionBar:
как настроить панель контекстных действий с помощью appCompat в материальном дизайне
Ответ 6
Очень полезный метод для приведения панели инструментов в начало toolbar.bringToFront()
Ответ 7
Еще одно небольшое дополнение: не забудьте установить хотя бы пустой экран в действии через setContentView(R.layout.empty_screen)
, если вы загрузите весь ui в фрагменты (ft.replace(android.R.id.content, fragment)
).