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

我正在使用在Lollipop和AppCompat-v7库中引入的新添加的工具栏。 我遵循这个指南设置工具栏我注意到,当你调用的东西,将带出上下文的ActionBar(如高亮复制/粘贴文本),它会推动工具栏在页面上。 你可以在页面底部的图片中看到我在说什么:

所以,本质上,我是这样设置的。 我有一个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); 

有谁知道如何使上下文ActionBar超越工具栏?

工具栏和上下文ActionBar

更新:

解决scheme:使用windowActionModeOverlay属性。 在你的主题中设置:

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

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


旧答案/解决方法:

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

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

 actionBarToolbar.setVisibility(View.GONE); 

并在onDestroyActionMode我再次显示它:

 actionBarToolbar.setVisibility(View.VISIBLE); 

隐藏/显示发生得如此之快,在我的testing设备上并不明显。 当然还有一个缺点:虽然inputanimation仍然有效,但上下文操作栏的退出animation会丢失,因为工具栏会立即popup。 但是,直到我们遇到一个更好的解决scheme,我想我们坚持这一点。


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

 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> 

只是一个小的补充:为

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

工作之前,在您的活动中调用setContentView(R.layout.your_activity) 之前调用super.onCreate(savedInstanceState)非常重要。 在这种情况下真的有所作为!

在我的情况下, <item name="windowActionModeOverlay">true</item>不起作用,但是这个工作: <item name="android:windowActionModeOverlay">true</item>android是关键。

雅各布的解决scheme为我工作,但上下文ActionBar是透明的,通过它的工具栏可见。 这可以解决如下:

 <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样式的更多细节:

如何在材质devise中使用appCompat自定义上下文动作栏

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

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