如何使用 AppCompat 自定义材料设计中的上下文操作栏

41

MainActivity.java

我已经在这个类中实现了MultiChoiceModeListener,以下是代码:

listView上:


我已在该类中实现了MultiChoiceModeListener,以下是代码:

listView上:

listView.setMultiChoiceModeListener(MainActivity.this);
listView.setChoiceMode(listView.CHOICE_MODE_MULTIPLE_MODAL);


    @Override
    public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) {
        switch (arg1.getItemId()) {
        case R.id.save:

            // Close CAB
            arg0.finish();
            return true;

        case R.id.saveto:


            // Close CAB
            arg0.finish();
            return true;
        default:
            return false;
        }
    }

    @Override
    public boolean onCreateActionMode(ActionMode arg0, Menu arg1) {
        arg0.getMenuInflater().inflate(R.menu.save_menu, arg1);
        return true;

    }

    @Override
    public void onDestroyActionMode(ActionMode arg0) {
        listadaptor.removeSelection();
    }

    @Override
    public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
        return false;
    }

    @Override
    public void onItemCheckedStateChanged(ActionMode arg0, int arg1, long arg2,
            boolean arg3) {

        final int checkedCount = listView.getCheckedItemCount();
        arg0.setTitle(checkedCount + " "+getResources().getString(R.string.selected));
        listadaptor.toggleSelection(arg1);
    }

样式文件.xml

 <style name="AppTheme.Base" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/White</item>
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionModeOverlay">true</item>
        <item name="windowActionBar">false</item>
        <item name="actionModeStyle">@style/LStyled.ActionMode</item>
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppTheme.Base">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>

    <style name="LStyled.ActionMode" parent="@style/Widget.AppCompat.ActionMode">
        <item name="background">@color/colorPrimary</item>
    </style>

    <style name="ActionBarThemeOverlay" parent="Theme.AppCompat.Light">
        <item name="android:textColorPrimary">#fff</item>
        <item name="colorControlNormal">#fff</item>
        <item name="colorControlHighlight">#3fff</item>
    </style>

    <style name="HeaderBar">
        <item name="android:background">#009688</item>
        <item name="android:textStyle">bold</item>
    </style>

    <style name="ActionBarPopupThemeOverlay" parent="ThemeOverlay.AppCompat.Light">
        <item name="android:textColor">#000</item>
    </style>

以下是我的截屏:

这是我的材料设计屏幕

操作模式材料设计屏幕

你可以看到两个截图,第二张截图中,操作模式的背景为白色,文本颜色也是白色...我想将其更改为顶部第一张截图的颜色。


你能解释一下为什么你给这个问题点了踩吗? - Sagar Maiyad
看不出为什么被踩了。点赞了。 - Gil Julio
你得到这个答案了吗? - krisDrOid
1
是的,下面的答案被接受了。 - Sagar Maiyad
@Riser 你是如何使标题变成白色的? - Prabs
这个问题帮助了我很多。现在我可以将操作模式放在操作栏上并保持setMultiChoiceModeListener。 - pengguang001
3个回答

92
你可以通过属性actionModeStyle更改ActionMode的背景:
<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    ....
    ....
    <item name="actionModeStyle">@style/LStyled.ActionMode</item>
</style>

<style name="LStyled.ActionMode" parent="@style/Widget.AppCompat.ActionMode">
    <item name="background">@color/color_action_mode_bg</item>
</style>

当然,你需要定义一个名为color_action_mode_bg的颜色:

<color name="color_action_mode_bg">#009688</color>

还有其他您可以更改的内容。例如:

<item name="titleTextStyle">...</item>
<item name="subtitleTextStyle">...</item>
<item name="height">...</item>

要更改SAVESAVETO的文本颜色,请在AppTheme.Base中添加以下内容:

<item name="actionMenuTextColor">@color/color_action_mode_text</item>

1
@MunimJi 你如何启动这个 ActionMode?你能分享一下代码吗?如果你使用的是 startActionMode(...),那么你需要将其更改为 startSupportActionMode(...) - Vikram
1
@Prabs,你应该能够在LStyled.ActionMode下设置<item name="titleTextStyle">...</item>。提供给titleTextStyle的值将是从TextAppearance.AppCompat.Widget.ActionMode.Title继承的样式。在这个样式里, 重写android:textColor并将其分配为@android:color/white - Vikram
@MihirShah 你正在使用哪个API版本?你如何启动操作模式? - Vikram
ActionMode actionMode = mActivity.startSupportActionMode(this); lollipop 5.1 api - Mihir Shah
@MihirShah 好的。你的活动的父主题是什么?Theme.AppCompat - Vikram
显示剩余13条评论

34

在你的AppTheme.Base样式中使用actionModeBackground

<item name="actionModeBackground">@color/colorPrimary </item> (or)
<item name="android:actionModeBackground">@color/colorPrimary </item>

1
适用于Lollipop和KitKat。 - Meanman
如何更改CAB中溢出菜单项的背景颜色和文本颜色? - Mihir Shah

0
要更改上下文操作栏的标题颜色,这是唯一对我有效的方法: 在您的活动主题中编写此内容。
<item name="actionModeStyle">@style/ContextualActionModeTheme</item>

定义样式

<style name="ContextualActionModeTheme" parent="@style/Widget.AppCompat.ActionMode">
       <item name="titleTextStyle">@style/titleColor</item>
</style>
<style name="titleColor" parent="TextAppearance.AppCompat.Widget.ActionMode.Title">
       <item name="android:textColor">@color/your_color_here</item>
</style>

您的上下文操作栏标题颜色将被更改。


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