如何在ActionMode内更改TextView的背景颜色

jwi*_*ir3 5 android styles android-actionbar android-actionmode

TextView的操作栏位于内部,如下所示:

非动作模式图片

我已将逻辑配置为在我长按关联的项目时使其Toolbar与重叠。最终结果如下所示:ActionModeListView

动作模式图片

除了TextView标题中令人讨厌的背景,这基本上是正确的ActionMode

从更改文件Widget.ActionMode样式styles.xml到实际将设置actionModeStyle为特定样式,我已经做了很多尝试。TextView不过,似乎没有任何影响。

我已通读过如何在Android中更改ActionMode背景颜色,但是我所做的任何事情似乎都不会对此背景产生影响。

注意:如果有某种方法可以在渲染时查看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>
Run Code Online (Sandbox Code Playgroud)

cod*_*zjx 2

我认为你可以尝试使用 hack 方式来更改背景:

\n\n

通过Java:

\n\n
    \n
  1. 用于hierarchyviewer.bat分析布局,关注视图ActionMode,可以看到如下:(Title ID: action_bar_title, SubTitle ID: action_bar_subtitle
  2. \n
\n\n

在此输入图像描述

\n\n

TextView2.根据我们上面找到的ID找到指定的,然后做你想做的事!

\n\n
/**\n * To hack the title and subTitle in ActionMode\n */\nprivate void hack() {\n    int titleID = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");\n    View titleView = getWindow().getDecorView().findViewById(titleID);\n    if ((titleView != null) && (titleView instanceof TextView)) {\n        ((TextView) titleView).setBackgroundColor(Color.RED);\n    }\n    int subTitleID = Resources.getSystem().getIdentifier("action_bar_subtitle", "id", "android");\n    View subTitleView = getWindow().getDecorView().findViewById(subTitleID);\n    if ((subTitleView != null) && (subTitleView instanceof TextView)) {\n        ((TextView) subTitleView).setBackgroundColor(Color.GREEN);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

3.创建时可以调用该方法ActionMode,例如:在onCreateActionMode(). 最终结果\xef\xbc\x9a

\n\n

在此输入图像描述

\n\n

通过样式:

\n\n

或者您可以尝试设置 aandroid:actionModeStyle来控制标题和副标题背景,但android:background似乎不起作用:

\n\n
<!-- Base application theme. -->\n<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">\n    <!-- Customize your theme here. -->\n    <item name="android:actionModeBackground">@android:color/white</item>\n    <item name="android:actionModeStyle">@style/TestActionModeStyle</item>\n</style>\n\n<style name="TestActionModeStyle">\n    <item name="android:titleTextStyle">@style/TestTitleStyle</item>\n    <item name="android:subtitleTextStyle">@style/TestSubTitleStyle</item>\n</style>\n\n<style name="TestTitleStyle">\n    <item name="android:textColor">@android:color/black</item>\n    <item name="android:background">@android:color/holo_red_dark</item>\n</style>\n\n<style name="TestSubTitleStyle">\n    <item name="android:textColor">@android:color/black</item>\n    <item name="android:background">@android:color/holo_green_dark</item>\n</style>\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:

\n\n

顺便一提:

\n\n

我认为最灵活的方式是自定义你自己的ActionMode视图,这很容易实现,只需设置一个自定义视图即可:

\n\n
@Override\npublic boolean onCreateActionMode(ActionMode pMode, Menu pMenu) {\n    RelativeLayout layout = (RelativeLayout) LayoutInflater.from(mContext).inflate(R.layout.custom_layout, null);\n    findView(...);\n    initView(...);\n    pMode.setCustomView(layout);\n    return true;\n}\n
Run Code Online (Sandbox Code Playgroud)\n