我正在使用 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 超越工具栏?
解决方案:使用windowActionModeOverlay属性。在你的主题中设置这个:
<item name="windowActionModeOverlay">true</item>
并且动作模式将显示在动作栏上,而不是向下推。(如果您没有使用最新的 AppCompat,那么您需要在属性中添加“android:”前缀)。它基本上让 AppCompat 知道您有一个位于屏幕顶部的工具栏,并且它应该在其顶部绘制 ActionMode。
我遇到了同样的问题。无论我设置什么主题,它总是将我设置为 ActionBar 的 Toolbar 下推。我尝试了有无支持库,但这没关系。
不幸的是,我无法修复它,所以我建立了一个解决方法。在我ActionModeCallback的中,onCreateActionMode我隐藏了操作栏:
ActionModeCallback
onCreateActionMode
actionBarToolbar.setVisibility(View.GONE);
在onDestroyActionMode我再次展示它:
onDestroyActionMode
actionBarToolbar.setVisibility(View.VISIBLE);
隐藏/显示发生得如此之快,以至于在我的测试设备上并不明显。当然有一个缺点:虽然进入动画仍然有效,但上下文操作栏的退出动画会丢失,因为工具栏会立即弹出它。但在我们遇到更好的解决方案之前,我想我们会坚持下去。
(我的 Activity 实际上是扩展了一个自定义BaseActivity类,该类有一个名为 的方法getActionBarToolbar(),取自Google I/O 2014 应用程序源代码,因此我可以轻松获取工具栏:
BaseActivity
getActionBarToolbar()
BaseActivity activity = (BaseActivity) getActivity(); activity.getActionBarToolbar().setVisibility(View.GONE);
太糟糕了 I/O 应用程序不使用上下文操作栏。)