Панель инструментов и контекстный 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)).