我在操作栏中有一个TextView,如下所示:
我有逻辑配置,当我长按相关ListView中的项目时,它使用ActionMode覆盖工具栏.最终看起来如下所示:
这基本上是正确的,除了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>
最佳答案 我想你可以尝试使用hack方式来改变背景:
通过Java:
>使用hierarchyviewer.bat分析布局,关注ActionMode视图,您可以在下面看到:(标题ID:action_bar_title,SubTitle ID:action_bar_subtitle)
2.通过我们在上面找到的ID找到指定TextView,并随便做任何事情!
/**
* 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.您可以在ActionMode创建时调用此方法,例如:inCreateActionMode().最后结果:
通过风格:
或者你可以尝试设置一个android:actionModeStyle来控制标题和subTitle背景,但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;
}