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

6

我在我的操作栏中放置了一个 TextView,如下所示:

non-action mode image

我已经配置了逻辑,使得当我长按相关的ListView中的某个项目时,它会用一个ActionMode覆盖Toolbar。效果如下:

action mode image

这基本上是正确的,除了在ActionModeTextView标题周围的恼人背景。我尝试了很多方法,从更改styles.xml文件中的Widget.ActionMode样式,到实际设置actionModeStyle为特定样式。然而,好像没有任何事情会影响这个TextView。我已经阅读了如何在Android中更改ActionMode背景颜色,但似乎我所做的任何事情都没有影响这个背景。 侧面说明:如果有一种方式可以在Android设备呈现时查看样式层次结构,那将非常好。层次结构查看器让我了解了大约三分之一,但它没有任何样式信息。有人知道这样一个工具,我可以用来调试这个问题吗? 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>

我不确定是否理解您的问题,如果您需要根据EditText状态更改背景,则可以在EditText背景中使用state 来实现。 - Muhannad Fakhouri
@MuhannadFakhouri 这不是一个 EditText,而是默认的 TextView,它是 ActionMode 中的标题。我使用 ActionMode 对象上的 setTitle() 方法设置文本本身。我想知道如何设置样式,因为我从其他 SO 帖子中获取的当前解决方案似乎没有任何作用。 - jwir3
1个回答

2
我认为你可以尝试使用黑科技的方式来更改背景:

通过Java:

  1. 使用 hierarchyviewer.bat 分析布局,关注 ActionMode 视图,您可以看到如下内容:(标题 ID:action_bar_title,子标题 ID:action_bar_subtitle

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;
}

谢谢,@Bill。我一有机会就会查看这个。 - jwir3
1
最终我按照建议创建了一个自定义视图。感谢您的答案,@Bill。 - jwir3
@jwir3 是的,我在我的项目中也是用同样的方法! - codezjx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接