启动 ActionMode 时的两个操作栏

Two actionbars when starting ActionMode

我有以下 activity 布局:

<?xml version="1.0" encoding="utf-8"?>

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawerLayout"
    style="@style/DrawerLayout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context=".ui.activity.MyActivity">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/app_bar"
            android:layout_width="match_parent"
            android:layout_height="@dimen/app_bar_height"
            android:background="@color/black"
            android:fitsSystemWindows="true"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/toolbar_layout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                app:collapsedTitleTextAppearance="@style/ToolbarTitle"
                app:contentScrim="@color/primary"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar_top"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/AppTheme.PopupOverlay"
                    app:theme="@style/ThemeOverlay.AppCompat.Light"/>

            </android.support.design.widget.CollapsingToolbarLayout>
        </android.support.design.widget.AppBarLayout>

        <my.package.ui.widget.MyHeaderWidget
            android:id="@+id/deal_header"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_behavior="my.package.ui.activity.MyHeaderBehavior"/>

        <include layout="@layout/content_list"/>
    </android.support.design.widget.CoordinatorLayout>

    <include layout="@layout/navigation_view"/>

</android.support.v4.widget.DrawerLayout>

它用于折叠工具栏 + 导航抽屉 + 标题动画和子标题(在 header 小部件中)。 一切都很好,直到我尝试启动 ActionMode 以启用 multi-selection.

我通过调用:

    mActionMode = mCollapsingToolbarLayout.startActionMode(mActionModeCallback);

问题是我最终有两个操作栏(带有两个箭头):

黑色的是我期待的那个,白色的是在我启动 ActionMode 时添加的。

我是不是做错了什么?

编辑

AndroidMaifest

    <activity
        android:name=".ui.activity.MyActivity"
        android:label="@string/title_activity"
        android:theme="@style/MyTheme">
    </activity>

styles.xml

<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowBackground">@drawable/window_background_gray</item>
    <item name="android:colorBackground">@color/app_background</item>
    <item name="displayOptions">showHome|homeAsUp|showTitle</item>
    <item name="android:icon">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="colorPrimary">@color/primary</item>
    <item name="colorAccent">@color/accent</item>
    <item name="colorPrimaryDark">@color/primaryDark</item>
    <item name="android:textAppearanceButton">@style/Theme.ButtonTextAppearance</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

EDIT2

如果您想测试这个问题,您可以在 Android studio 中使用 ScrollingActivity 示例代码创建一个新项目。 按照您认为应该的方式修改主题,然后在按下 FAB 时启动操作模式,将以下 object 作为 ActionMode.Callback 传递给 startSupportActionMode:

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
    // Called when the action mode is created; startActionMode() was called
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate a menu resource providing context menu items
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.menu_scrolling, menu);
        return true;
    }

    // Called each time the action mode is shown. Always called after onCreateActionMode, but
    // may be called multiple times if the mode is invalidated.
    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false; // Return false if nothing is done
    }

    // Called when the user selects a contextual menu item
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:
                mode.finish();
                return true;
            default:
                return false;
        }
    }

    // Called when the user exits the action mode
    @Override
    public void onDestroyActionMode(ActionMode mode) {
        mActionMode = null;
    }
};

您需要告诉系统您改用自定义工具栏。 为此,在 Activity 的 onCreate 中,只需添加以下内容:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.your_layout);
  //Then get a reference to your Toolbar
  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_top);
  //Tell the system to use yours
  setSupportActionBar(toolbar);
}

我的 Activity 扩展了 AppCompatActivity,这就是我使用 setSupportActionBar 的原因,但您会发现常规 Activity setActionBar 的方法相同

此外,您需要创建样式(在 res/values/styles.xml 下):

<style name="MyNoAppBarTheme" parent="AppTheme">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

或者如果您还没有覆盖您的 AppTheme:

<style name="MyNoAppBarTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

最后在清单中为那个特定的 activity 设置这个主题:

<activity
        android:name=".ui.activities.YourActivity"
        android:label="@string/app_name"
        android:theme="@style/MyNoAppBarTheme"
        />

编辑: 编辑问题后,actionMode 似乎确实是这里的问题。如 this answer 中所述,请确保您使用的是正确的导入,以及使用 startSupportActionMode 而不是 startActionMode

尝试在 styles.xml 中的主题中添加以下内容 -

<item name="android:windowActionBarOverlay">false</item>
<item name="windowActionBarOverlay">false</item>
<item name="windowActionModeOverlay">true</item>

如果您使用 Toolbar -

,请同时添加以下行
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

您的父主题必须是一些 NoAction 栏主题

  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

        <item name="colorControlNormal">@color/colorPrimary</item>
        <item name="colorControlActivated">@color/colorAccent</item>
    </style>

如果您使用工具栏,这 3 行就足够了:

 <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionModeOverlay">true</item> <!-- This is the important line -->
</style>

记得在文件 styles 和 styles(v21) 中添加它