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

Android 如何在ActionMode内更改TextView的背景色,android,android-actionbar,styles,android-actionmode,Android,Android Actionbar,Styles,Android Actionmode,我的操作栏中有一个TextView,如下所示: 我已经配置了逻辑,当我长按关联的列表视图中的某个项目时,它将覆盖工具栏和操作模式。最终的结果如下所示: 这基本上是正确的,除了ActionMode中TextView标题周围令人讨厌的背景之外 我尝试了很多方法,从更改style.xml文件中的Widget.ActionMode样式,到实际将actionmodel设置为特定样式。不过,似乎没有任何东西会影响此TextView 我已经通读了一遍,但似乎我所做的任何事情都不会对这个背景产生影响 旁注:

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

我已经配置了逻辑,当我长按关联的
列表视图中的某个项目时,它将覆盖
工具栏
操作模式
。最终的结果如下所示:

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

我尝试了很多方法,从更改
style.xml
文件中的
Widget.ActionMode
样式,到实际将
actionmodel
设置为特定样式。不过,似乎没有任何东西会影响此
TextView

我已经通读了一遍,但似乎我所做的任何事情都不会对这个背景产生影响

旁注:如果能够在呈现Android设备时以某种方式查看其样式层次结构,那就太好了。hierarchy viewer让我了解了其中的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>

@整数/文本\标题\最大\行
@整数/轨道\u抽象\u最大\u行
@可绘制/可激活\u项目\u背景
真的
真的
@颜色/应用程序\绿色\深色
@android:彩色/白色
@android:彩色/白色
@android:彩色/白色
@颜色/应用程序绿色
@android:彩色/白色
@android:彩色/白色
@颜色/应用程序\绿色\深色

我想你可以尝试用黑客的方式来改变背景:

通过Java:

<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>
  • 使用
    hierarchyviewer.bat
    分析布局,关注
    ActionMode
    视图,您可以看到以下内容:(标题ID:
    action\u bar\u Title
    ,副标题ID:
    action\u SubTitle
  • 2.根据我们在上面找到的ID找到specify
    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
    create时调用此方法,例如:在
    onCreateActionMode()
    中。最终结果:

    通过样式:

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

    我不确定我是否理解你的问题,如果你需要根据你的editText状态改变背景,你可以在你的editText中这样做background@MuhannadFakhouri它不是
    EditText
    ,而是
    ActionMode
    中的默认
    TextView
    标题。我使用
    ActionMode
    对象上的
    setTitle()
    设置文本本身。我想知道如何设置样式,因为我从其他帖子中收集到的当前解决方案似乎没有任何作用。谢谢,@Bill。一旦有机会,我会尽快查看。我最终按照建议创建了一个自定义视图。谢谢你的回答,@Bill@jwir3是的,我在我的项目中使用同样的方法!