使用 AppCompat-v7的工具栏和上下文操作栏

我正在使用 Lollipop 和 AppCompat-v7库中引入的新添加的工具栏。我跟随 这本指南设置了工具栏,我注意到当你调用一些东西时,它会弹出上下文操作栏(比如为复制/粘贴而突出显示文本) ,它会将工具栏向下推到页面上。你可以在页面底部的图片中看到我所说的内容:

所以,基本上,我把它设置成这样。我在 xml 文件中定义了工具栏,我使用 include 标记:

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

有人知道如何使上下文操作栏超过工具栏吗?

Toolbar and Contextual ActionBar

63071 次浏览

更新:

解决方案: 使用 视窗动作模式叠加属性。在主题中设置:

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

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


老办法:

我也遇到了同样的问题。无论我设置什么主题,它总是下拉我设置为 ActionBar 的工具栏。我试过不管有没有支持库,但都无济于事。

不幸的是,我无法修复它,所以我建立了一个工作区代替。在我的 ActionModeCallbackonCreateActionMode中,我隐藏了动作条:

actionBarToolbar.setVisibility(View.GONE);

然后在 onDestroyActionModeI 中再次展示:

actionBarToolbar.setVisibility(View.VISIBLE);

隐藏/显示发生得如此之快,以至于在我的测试设备上无法察觉。当然还有一个缺点: 尽管输入动画仍然可以工作,但是上下文操作栏的退出动画会丢失,因为工具栏会立即弹出到它上面。但在我们找到更好的解决方案之前,我想我们只能这样了。


(My Activity 实际上是在扩展一个定制的 BaseActivity类,它有一个取自 Google I/O 2014应用程序源代码的名为 getActionBarToolbar()的方法,所以我可以很容易地获取工具栏:

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

糟糕的是,I/O 应用程序没有使用上下文操作栏。)

不要在你的活动中开始,而是在你的工具栏上。在你的活动中:

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

你必须使用

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

非常有用的方法,使工具栏前面的 toolbar.bringToFront()

对我来说, <item name="windowActionModeOverlay">true</item>不起作用, 但是这个工作: <item name="android:windowActionModeOverlay">true</item>android是关键。

只是一个小小的补充: 为了

<item name="windowActionModeOverlay">true</item>
to work it's important to call super.onCreate(savedInstanceState) BEFORE calling setContentView(R.layout.your_activity) in your activity. It really makes a difference in this case!

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

Jacob 的解决方案对我有效,但是上下文操作栏是透明的,工具栏可以通过它看到。解决办法如下:

<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”必须是应用于工具栏的主题。

关于上下文操作栏样式的更多细节:

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