Светлый режим действия на темной панели инструментов

Я пытаюсь отобразить светлый режим действий (белый фон, черный текст, черные значки) на темной панели инструментов (фон с настраиваемым цветом через основной цвет, белый текст, белые значки).

Вот определение моего Toolbar в макете моей деятельности:

<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/activity_press_toolbar_background"
        android:theme="@style/AppTheme.MainToolbar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

Вот упомянутый AppTheme.MainToolbar:

<style name="AppTheme.MainToolbar" parent="@style/ThemeOverlay.AppCompat.ActionBar"/>

С этими определениями стиля все выглядит так, как я хочу, за исключением значка переполнения на панели инструментов «по умолчанию» (без режима действий), который черный вместо белого. Если я наследую от @style/ThemeOverlay.AppCompat.Dark.ActionBar для темы Toolbar, переполнение будет белым, но режим действий также станет темным: темно-серый фон, белый текст и значки.

Я попытался переопределить практически все в своем стиле режима действий:

<style name="AppTheme.ActionMode" parent="Widget.AppCompat.ActionMode">
    <item name="background">@android:color/white</item>
    <item name="android:titleTextStyle">@style/AppTheme.ActionMode.Title</item>
    <item name="titleTextStyle">@style/AppTheme.ActionMode.Title</item>
    <item name="actionOverflowButtonStyle">@style/AppTheme.ActionMode.Overflow</item>
    <item name="android:actionOverflowButtonStyle">@style/AppTheme.ActionMode.Overflow</item>
</style>

<style name="AppTheme.ActionMode.Title" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
    <item name="android:textColor">@android:color/black</item>
</style>

<style name="AppTheme.ActionMode.Overflow" parent="Widget.AppCompat.ActionButton.Overflow">
    <item name="android:tint">#000000</item>
</style>

Я использовал этот ActionMode стиль в своем основном стиле:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- ... -->
    <item name="actionModeStyle">@style/AppTheme.ActionMode</item>
    <item name="android:actionModeStyle">@style/AppTheme.ActionMode</item>
</style>

Все работает… кроме цвета перелива. В режиме действия он белый (на белом, так что…). Если я установил атрибуты actionOverflowButtonStyle для своего основного стиля, переполнение будет правильно окрашено, но для всего приложения, включая режим действий.

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


person Marc Plano-Lesay    schedule 16.08.2017    source источник


Ответы (1)


Вот способ исправить это, но я уверен, что есть способ лучше. Если у вас есть лучшее решение, пожалуйста, опубликуйте его. Если у вас нет и вы столкнулись с той же проблемой, не стесняйтесь использовать это, но имейте в виду, что это зависит от реализации кнопки переполнения и описания содержимого, присущего библиотекам поддержки. Работает с v26, может не работать с другой версией. Проверяйте это всякий раз, когда обновляете свои библиотеки поддержки.

private static void setOverflowButtonColor(@ColorRes final int color, @NonNull final Activity activity) {
    final String contentDescription = activity.getResources().getString(R.string.abc_action_menu_overflow_description);
    final ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
    decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            final ArrayList outViews = new ArrayList(1);
            decorView.findViewsWithText(outViews, contentDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
            if (!outViews.isEmpty()) {
                if (outViews.get(0) instanceof AppCompatImageView) {
                ((AppCompatImageView) outViews.get(0)).setColorFilter(ContextCompat.getColor(activity, color));
                decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            }
        }
    });
}
person Marc Plano-Lesay    schedule 04.04.2018