黑暗工具栏上的灯光动作模式

时间:2017-08-16 09:31:52

标签: android android-toolbar android-styles android-actionmode

我试图在黑暗的工具栏上显示灯光动作模式(白色背景,黑色文字,黑色图标)(通过原色,白色文字,白色图标自定义彩色背景)。

以下是我的活动布局中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"/>

使用这些样式定义,一切都像我想要的那样,除了&#34;默认&#34;上的溢出图标。工具栏(非动作模式),黑色而不是白色。如果我从@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属性,则溢出会正确着色 - 但在整个应用程序中,包括操作模式。

重新定义整个风格听起来并不合适 - 而且无论如何都不起作用,至少对于溢出来说是这样。但是我找不到在暗动作条上定义灯光动作模式的方法。有没有办法这样做?

1 个答案:

答案 0 :(得分:0)

这是解决此问题的方法,但我确信有更好的方法。如果您有更好的解决方案,请发布。如果您没有并且遇到同样的问题,请随意使用它,但要注意它依赖于支持库固有的溢出按钮和内容描述的实现。它适用于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);
                }
            }
        }
    });
}