184

我正在使用 Lollipop 和 AppCompat-v7 库中引入的新添加的工具栏。我按照本指南设置工具栏我注意到,当您调用一些会调出上下文操作栏的东西(例如突出显示用于复制/粘贴的文本)时,它会将工具栏向下推到页面上。您可以在页面底部的图像中看到我在说什么:

所以,基本上,我是这样设置的。我在包含标签的 xml 文件中定义了工具栏:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"/>

然后,我在我的视图中实例化它:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id="@+id/root"
    tools:context=".MainActivity">

    <include
        layout="@layout/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/> 

    <!-- Rest of view -->

    </LinearLayout>

在代码中,我这样设置:

    // On Create method of activity:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

有谁知道如何使 Contextual ActionBar 超越工具栏?

工具栏和上下文操作栏

4

7 回答 7

324

更新:

解决方案:使用windowActionModeOverlay属性。在你的主题中设置这个:

<item name="windowActionModeOverlay">true</item>

并且动作模式将显示在动作栏上,而不是向下推。(如果您没有使用最新的 AppCompat,那么您需要在属性中添加“android:”前缀)。它基本上让 AppCompat 知道您有一个位于屏幕顶部的工具栏,并且它应该在其顶部绘制 ActionMode。


旧答案/解决方法:

我遇到了同样的问题。无论我设置什么主题,它总是将我设置为 ActionBar 的 Toolbar 下推。我尝试了有无支持库,但这没关系。

不幸的是,我无法修复它,所以我建立了一个解决方法。在我ActionModeCallback的中,onCreateActionMode我隐藏了操作栏:

actionBarToolbar.setVisibility(View.GONE);

onDestroyActionMode我再次展示它:

actionBarToolbar.setVisibility(View.VISIBLE);

隐藏/显示发生得如此之快,以至于在我的测试设备上并不明显。当然有一个缺点:虽然进入动画仍然有效,但上下文操作栏的退出动画会丢失,因为工具栏会立即弹出它。但在我们遇到更好的解决方案之前,我想我们会坚持下去。


(我的 Activity 实际上是扩展了一个自定义BaseActivity类,该类有一个名为 的方法getActionBarToolbar(),取自Google I/O 2014 应用程序源代码,因此我可以轻松获取工具栏:

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

太糟糕了 I/O 应用程序不使用上下文操作栏。)

于 2014-10-19T13:11:06.177 回答
16

不要在您的活动上启动它,而是在您的工具栏上启动它。在你的活动中:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

你必须使用

<item name="windowActionModeOverlay">true</item>
于 2014-12-08T09:15:59.750 回答
14

只是一个小补充:对于

<item name="windowActionModeOverlay">true</item>
为了工作,在调用您的活动super.onCreate(savedInstanceState) 之前调用很重要。setContentView(R.layout.your_activity)在这种情况下真的很重要!

于 2015-02-03T16:23:59.860 回答
11

在我的情况下, <item name="windowActionModeOverlay">true</item>没有工作,但这项工作:<item name="android:windowActionModeOverlay">true</item>,这android是关键。

于 2015-01-25T16:20:08.923 回答
8

Jacob 的解决方案对我有用,但上下文 ActionBar 是透明的,并且通过它可以看到 Toolbar。这可以解决如下:

<style name="AppTheme.Base" parent="Theme.AppCompat.Light">
    ....
    ....
    <item name="actionModeStyle">@style/CustomActionMode</item>
</style>

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

主题“AppTheme.Base”必须是应用于工具栏的主题。

有关上下文 ActionBar 样式的更多详细信息:

如何在 Material Design 中使用 appCompat 自定义上下文操作栏

于 2015-07-29T06:02:29.477 回答
0

setContentView(R.layout.empty_screen)另一个小补充:如果您在片段中加载整个 ui ( ft.replace(android.R.id.content, fragment)) ,请确保在 Activity 中至少设置一个空白屏幕。

于 2015-03-23T18:24:48.640 回答
0

将工具栏放在前面的非常有用的方法toolbar.bringToFront()

于 2014-12-16T09:25:20.647 回答