使用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超越工具栏?
更新:
解决scheme:使用windowActionModeOverlay属性。 在你的主题中设置:
<item name="windowActionModeOverlay">true</item>
动作模式将显示在操作栏上而不是按下。 (如果你不使用最新的AppCompat,那么你需要添加“android:”前缀到属性)。 它基本上让AppCompat知道你有一个工具栏位于屏幕的顶部,它应该在其上面绘制ActionMode。
旧答案/解决方法:
我遇到了同样的问题。 无论我设置了什么主题,它总是将我设置为ActionBar的工具栏按下。 我尝试了和没有支持库,但没关系。
不幸的是,我无法修复它,所以我build立了一个解决方法。 在我的ActionModeCallback
的onCreateActionMode
我隐藏了操作栏:
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设置一个空屏幕。