Панель инструментов и контекстная панель действий с AppCompat-v7

Я работаю над использованием недавно добавленной Панели инструментов, которая была представлена ​​в Lollipop и библиотеке AppCompat-v7. Я следовал этому руководству по настройке панели инструментов. Я заметил, что когда вы вызываете что-то, что вызывает контекстную панель действий (например, выделение текста для копирования / вставки), она толкает панель инструментов вниз на странице. Вы можете видеть то, о чем я говорю, на картинке внизу страницы:

Итак, по сути, я настроил это так. У меня есть панель инструментов, определенная в XML-файле, который я использую с тегами включения:

<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);

Кто-нибудь знает, как сделать так, чтобы Contextual ActionBar вышел поверх панели инструментов?

Панель инструментов и контекстная панель действий

7 ответов

Решение

Обновить:

Решение: используйте свойство windowActionModeOverlay. Установите это в вашей теме:

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

и режим действия будет отображаться над панелью действий вместо нажатия на нее вниз. (Если вы не используете последнюю версию AppCompat, вам нужно добавить к свойству префикс "android:"). Это в основном позволяет AppCompat знать, что у вас есть панель инструментов, расположенная в верхней части экрана, и что она должна рисовать ActionMode поверх нее.


Старый ответ / обходной путь:

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

К сожалению, я не смог это исправить, поэтому вместо этого я нашел обходной путь. В моем ActionModeCallback"s onCreateActionMode Я скрываю панель действий:

actionBarToolbar.setVisibility(View.GONE);

И в onDestroyActionModeЯ показываю это снова:

actionBarToolbar.setVisibility(View.VISIBLE);

Скрытие / отображение происходит так быстро, что это не заметно на моих тестовых устройствах. Есть, конечно, и обратная сторона: хотя анимация ввода все еще работает, анимация выхода контекстной панели действий теряется, потому что панель инструментов сразу же появляется над ней. Но пока мы не найдем лучшее решение, я думаю, что мы застряли с этим.


(Моя активность фактически расширяет BaseActivity класс, который имеет метод с именем getActionBarToolbar()взято из исходного кода приложения Google I/O 2014, поэтому я могу легко получить панель инструментов:

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

Жаль, что приложение ввода-вывода не использует контекстную панель действий.)

Не запускайте его на своей деятельности, но на панели инструментов. В вашей деятельности:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

и вы должны использовать

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

Просто небольшое дополнение: для

<item name="windowActionModeOverlay">true</item>
на работу важно позвонить super.onCreate(savedInstanceState) ДО вызова setContentView(R.layout.your_activity) в вашей деятельности. Это действительно имеет значение в этом случае!

В моем случае,<item name="windowActionModeOverlay">true</item>не работал, но эта работа:<item name="android:windowActionModeOverlay">true</item>, то android это ключ.

Решение Джейкоба сработало для меня, но контекстный 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 в дизайне материала

Очень полезный способ вывести панель инструментов вперед toolbar.bringToFront()

Еще одно небольшое дополнение: убедитесь, что по крайней мере пустой экран в активности через setContentView(R.layout.empty_screen) если вы загружаете весь интерфейс фрагментарно (ft.replace(android.R.id.content, fragment)).

Другие вопросы по тегам