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

时间:2015-05-11 19:29:05

标签: android android-actionbar styles android-actionmode

我的操作栏中有TextView,如下所示:

non-action mode image

我有逻辑配置,当我长按关联的Toolbar中的某个项目时,它会使ActionModeListView重叠。最终看起来如下:

action mode image

除了TextViewActionMode标题周围令人讨厌的背景外,这基本上是正确的。

我已经尝试了很多方法,从更改Widget.ActionMode文件中的styles.xml样式到将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>

1 个答案:

答案 0 :(得分:2)

我认为您可以尝试使用黑客方式来更改背景:

通过Java:

  1. 使用hierarchyviewer.bat分析布局,关注ActionMode视图,您可以在下面看到:(标题ID:action_bar_title,SubTitle ID:action_bar_subtitle
  2. enter image description here

    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创建时调用此方法,例如:在onCreateActionMode()中。最终结果:

    enter image description here

    通过风格:

    或者您可以尝试设置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;
    }