我正在使用Lollipop和AppCompat-v7库中引入的新添加的工具栏。我跟着this guide设置了工具栏我注意到当你调用一些会调出上下文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);
有没有人知道怎么做才能让Contextual ActionBar超越工具栏?
答案 0 :(得分:316)
解决方案:使用windowActionModeOverlay属性。在主题中设置:
<item name="windowActionModeOverlay">true</item>
并且动作模式将显示在操作栏上,而不是将其向下推。 (如果您没有使用最新的AppCompat,那么您需要在属性中添加“android:”前缀)。它基本上让AppCompat知道你有一个位于屏幕顶部的工具栏,它应该在它上面绘制ActionMode。
我遇到了同样的问题。无论我设置什么主题,它总是按下我设置为ActionBar的工具栏。我尝试使用和不使用支持库,但这没关系。
不幸的是我无法修复它所以我已经构建了一个解决方法。在我ActionModeCallback
的{{1}}我隐藏了操作栏:
onCreateActionMode
并在actionBarToolbar.setVisibility(View.GONE);
我再次展示:
onDestroyActionMode
隐藏/显示发生得如此之快,在我的测试设备上并不明显。当然有一个缺点:尽管输入动画仍然有效,但是上下文操作栏的退出动画会丢失,因为工具栏会立即弹出它。但是在我们遇到更好的解决方案之前,我想我们会坚持这个。
(我的活动实际上正在扩展一个自定义actionBarToolbar.setVisibility(View.VISIBLE);
类,其中有一个名为BaseActivity
的方法,取自Google I/O 2014 app source code,因此我可以轻松获取工具栏:
getActionBarToolbar()
太糟糕了,I / O应用程序不使用上下文操作栏。)
答案 1 :(得分:15)
不要在您的活动上启动它,而是在工具栏上启动它。在你的活动中:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)
你必须使用
<item name="windowActionModeOverlay">true</item>
答案 2 :(得分:14)
只是一小部分: 对于
<item name="windowActionModeOverlay">true</item>
在您的活动中呼叫super.onCreate(savedInstanceState)
之前呼叫setContentView(R.layout.your_activity)
非常重要。
在这种情况下,这确实有所不同!
答案 3 :(得分:11)
就我而言,
<item name="windowActionModeOverlay">true</item>
没有用,
但是这项工作:<item name="android:windowActionModeOverlay">true</item>
,android
是关键。
答案 4 :(得分:8)
雅各布的解决方案对我有用,但上下文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>
主题&#34; AppTheme.Base&#34;必须是应用于工具栏的那个。
有关上下文ActionBar样式的更多详细信息:
how to Customize the Contextual Action Bar using appCompat in material design
答案 5 :(得分:0)
将工具栏置于前面toolbar.bringToFront()
答案 6 :(得分:0)
另一个小小的补充:如果您将整个ui加载到片段中(setContentView(R.layout.empty_screen)
),请务必通过ft.replace(android.R.id.content, fragment)
在活动中设置至少一个空白屏幕。