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