深色工具栏上的浅色操作模式
Light action mode on dark toolbar
我正在尝试在深色工具栏(通过原色、白色文本、白色图标自定义颜色背景)上显示浅色操作模式(白色背景、黑色文本、黑色图标)。
这是我的 activity 布局中 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"/>
有了这些样式定义,除了 "default" 工具栏(非操作模式)上的溢出图标外,一切都如我所愿,它是黑色而不是白色。如果我从 @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>
</pre>
一切正常……除了溢出颜色。在动作模式下,它是白色的(白色,所以……)。如果我在主样式上设置 actionOverflowButtonStyle
属性,溢出会正确着色 - 但在整个应用程序中,包括操作模式。
重新定义整个样式听起来不对 - 无论如何也行不通,至少对于溢出而言。但是我找不到在深色操作栏上定义浅色操作模式的方法。有什么办法吗?
这是解决此问题的方法,但我相信还有更好的方法。如果你有更好的解决办法,请post吧。如果您还没有遇到同样的问题,请随意使用它,但请注意,它依赖于支持库固有的溢出按钮和内容描述的实现。它适用于 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);
}
}
}
});
}
我正在尝试在深色工具栏(通过原色、白色文本、白色图标自定义颜色背景)上显示浅色操作模式(白色背景、黑色文本、黑色图标)。
这是我的 activity 布局中 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"/>
有了这些样式定义,除了 "default" 工具栏(非操作模式)上的溢出图标外,一切都如我所愿,它是黑色而不是白色。如果我从 @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> </pre>
一切正常……除了溢出颜色。在动作模式下,它是白色的(白色,所以……)。如果我在主样式上设置
actionOverflowButtonStyle
属性,溢出会正确着色 - 但在整个应用程序中,包括操作模式。重新定义整个样式听起来不对 - 无论如何也行不通,至少对于溢出而言。但是我找不到在深色操作栏上定义浅色操作模式的方法。有什么办法吗?
这是解决此问题的方法,但我相信还有更好的方法。如果你有更好的解决办法,请post吧。如果您还没有遇到同样的问题,请随意使用它,但请注意,它依赖于支持库固有的溢出按钮和内容描述的实现。它适用于 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);
}
}
}
});
}