如何更改 ActionMode 中 TextView 的背景颜色
How to change the background color of a TextView inside of an ActionMode
我的操作栏中有一个 TextView
,如下所示:
我配置了逻辑,当我 long-press 在关联的 ListView
中的项目上时,它会用 ActionMode
覆盖 Toolbar
。这最终看起来像下面这样:
这基本上是正确的,除了 ActionMode
中 TextView
标题周围的恼人背景。
我尝试了很多东西,从更改 styles.xml
文件中的 Widget.ActionMode
样式,到实际将 actionModeStyle
设置为特定样式。不过,这似乎没有任何影响 TextView
。
我已经通读了How to change ActionMode background color in Android,但似乎我所做的任何事情都不会对此背景产生影响。
旁注:如果有某种方法可以在呈现 Android 设备上查看样式层次结构,那就太好了。层次结构查看器让我了解了大约 1/3 的内容,但它没有任何样式信息。有人知道我可以用来调试这个问题的工具吗?
styles.xml(仅相关内容):
<style name="Material" parent="Theme.AppCompat.Light">
<item name="textHeaderMaxLines">@integer/text_header_max_lines</item>
<item name="trackAbstractMaxLines">@integer/track_abstract_max_lines</item>
<item name="activatableItemBackground">@drawable/activatable_item_background</item>
<!-- ActionMode Styles -->
<item name="android:windowActionModeOverlay">true</item>
<item name="windowActionModeOverlay">true</item>
<item name="actionModeBackground">@color/app_green_dark</item>
</style>
<style name="Material.AppBar" parent="Theme.AppCompat.NoActionBar">
<item name="android:textColorPrimaryInverse">@android:color/white</item>
<item name="android:actionMenuTextColor">@android:color/white</item>
<item name="android:textColorSecondary">@android:color/white</item>
<item name="android:background">@color/app_green</item>
<item name="android:color">@android:color/white</item>
<item name="android:textColor">@android:color/white</item>
</style>
<style name="Material.AppBar.ActionMode" parent="Widget.AppCompat.Light.ActionMode.Inverse">
<item name="android:background">@color/app_green_dark</item>
</style>
我觉得你可以尝试用黑客的方式来改变背景:
通过Java:
- 使用
hierarchyviewer.bat
分析布局,关注ActionMode
视图,如下图:(Title ID:action_bar_title
,SubTitle ID:action_bar_subtitle
)
2.Find 指定 TextView
通过我们上面找到的 ID,你想做什么就做什么!
/**
* To hack the title and subTitle in ActionMode
*/
private void hack() {
int titleID = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
View titleView = getWindow().getDecorView().findViewById(titleID);
if ((titleView != null) && (titleView instanceof TextView)) {
((TextView) titleView).setBackgroundColor(Color.RED);
}
int subTitleID = Resources.getSystem().getIdentifier("action_bar_subtitle", "id", "android");
View subTitleView = getWindow().getDecorView().findViewById(subTitleID);
if ((subTitleView != null) && (subTitleView instanceof TextView)) {
((TextView) subTitleView).setBackgroundColor(Color.GREEN);
}
}
3.You可以在ActionMode
创建时调用此方法,例如:在onCreateActionMode()
。最终结果:
通过样式:
或者你可以尝试设置一个android:actionModeStyle
来控制标题和副标题的背景,但是android:background
似乎不适合它:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:actionModeBackground">@android:color/white</item>
<item name="android:actionModeStyle">@style/TestActionModeStyle</item>
</style>
<style name="TestActionModeStyle">
<item name="android:titleTextStyle">@style/TestTitleStyle</item>
<item name="android:subtitleTextStyle">@style/TestSubTitleStyle</item>
</style>
<style name="TestTitleStyle">
<item name="android:textColor">@android:color/black</item>
<item name="android:background">@android:color/holo_red_dark</item>
</style>
<style name="TestSubTitleStyle">
<item name="android:textColor">@android:color/black</item>
<item name="android:background">@android:color/holo_green_dark</item>
</style>
编辑:
顺便说一句:
我认为最灵活的方法是自定义你自己的ActionMode
视图,这很容易实现,只需设置一个自定义视图:
@Override
public boolean onCreateActionMode(ActionMode pMode, Menu pMenu) {
RelativeLayout layout = (RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.custom_layout, null);
findView(...);
initView(...);
pMode.setCustomView(layout);
return true;
}
我的操作栏中有一个 TextView
,如下所示:
我配置了逻辑,当我 long-press 在关联的 ListView
中的项目上时,它会用 ActionMode
覆盖 Toolbar
。这最终看起来像下面这样:
这基本上是正确的,除了 ActionMode
中 TextView
标题周围的恼人背景。
我尝试了很多东西,从更改 styles.xml
文件中的 Widget.ActionMode
样式,到实际将 actionModeStyle
设置为特定样式。不过,这似乎没有任何影响 TextView
。
我已经通读了How to change ActionMode background color in Android,但似乎我所做的任何事情都不会对此背景产生影响。
旁注:如果有某种方法可以在呈现 Android 设备上查看样式层次结构,那就太好了。层次结构查看器让我了解了大约 1/3 的内容,但它没有任何样式信息。有人知道我可以用来调试这个问题的工具吗?
styles.xml(仅相关内容):
<style name="Material" parent="Theme.AppCompat.Light">
<item name="textHeaderMaxLines">@integer/text_header_max_lines</item>
<item name="trackAbstractMaxLines">@integer/track_abstract_max_lines</item>
<item name="activatableItemBackground">@drawable/activatable_item_background</item>
<!-- ActionMode Styles -->
<item name="android:windowActionModeOverlay">true</item>
<item name="windowActionModeOverlay">true</item>
<item name="actionModeBackground">@color/app_green_dark</item>
</style>
<style name="Material.AppBar" parent="Theme.AppCompat.NoActionBar">
<item name="android:textColorPrimaryInverse">@android:color/white</item>
<item name="android:actionMenuTextColor">@android:color/white</item>
<item name="android:textColorSecondary">@android:color/white</item>
<item name="android:background">@color/app_green</item>
<item name="android:color">@android:color/white</item>
<item name="android:textColor">@android:color/white</item>
</style>
<style name="Material.AppBar.ActionMode" parent="Widget.AppCompat.Light.ActionMode.Inverse">
<item name="android:background">@color/app_green_dark</item>
</style>
我觉得你可以尝试用黑客的方式来改变背景:
通过Java:
- 使用
hierarchyviewer.bat
分析布局,关注ActionMode
视图,如下图:(Title ID:action_bar_title
,SubTitle ID:action_bar_subtitle
)
2.Find 指定 TextView
通过我们上面找到的 ID,你想做什么就做什么!
/**
* To hack the title and subTitle in ActionMode
*/
private void hack() {
int titleID = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
View titleView = getWindow().getDecorView().findViewById(titleID);
if ((titleView != null) && (titleView instanceof TextView)) {
((TextView) titleView).setBackgroundColor(Color.RED);
}
int subTitleID = Resources.getSystem().getIdentifier("action_bar_subtitle", "id", "android");
View subTitleView = getWindow().getDecorView().findViewById(subTitleID);
if ((subTitleView != null) && (subTitleView instanceof TextView)) {
((TextView) subTitleView).setBackgroundColor(Color.GREEN);
}
}
3.You可以在ActionMode
创建时调用此方法,例如:在onCreateActionMode()
。最终结果:
通过样式:
或者你可以尝试设置一个android:actionModeStyle
来控制标题和副标题的背景,但是android:background
似乎不适合它:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:actionModeBackground">@android:color/white</item>
<item name="android:actionModeStyle">@style/TestActionModeStyle</item>
</style>
<style name="TestActionModeStyle">
<item name="android:titleTextStyle">@style/TestTitleStyle</item>
<item name="android:subtitleTextStyle">@style/TestSubTitleStyle</item>
</style>
<style name="TestTitleStyle">
<item name="android:textColor">@android:color/black</item>
<item name="android:background">@android:color/holo_red_dark</item>
</style>
<style name="TestSubTitleStyle">
<item name="android:textColor">@android:color/black</item>
<item name="android:background">@android:color/holo_green_dark</item>
</style>
编辑:
顺便说一句:
我认为最灵活的方法是自定义你自己的ActionMode
视图,这很容易实现,只需设置一个自定义视图:
@Override
public boolean onCreateActionMode(ActionMode pMode, Menu pMenu) {
RelativeLayout layout = (RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.custom_layout, null);
findView(...);
initView(...);
pMode.setCustomView(layout);
return true;
}