带有 AppCompat-v7 的工具栏和上下文操作栏 [英] Toolbar and Contextual ActionBar with AppCompat-v7
问题描述
我正在使用 Lollipop 和 AppCompat-v7 库中引入的新添加的工具栏.我按照 属性.在您的主题中设置:
- true
并且操作模式将显示在操作栏上,而不是将其按下.(如果您没有使用最新的 AppCompat,那么您需要在属性中添加android:"前缀).它基本上让 AppCompat 知道你有一个位于屏幕顶部的工具栏,它应该在它上面绘制 ActionMode.
旧答案/解决方法:
我遇到了同样的问题.无论我设置什么主题,它总是将我设置为 ActionBar 的 Toolbar 下推.我尝试过使用和不使用支持库,但没关系.
不幸的是我无法修复它,所以我已经建立了一个解决方法.在我的 ActionModeCallback
的 onCreateActionMode
中,我隐藏了操作栏:
actionBarToolbar.setVisibility(View.GONE);
然后在 onDestroyActionMode
中再次显示:
actionBarToolbar.setVisibility(View.VISIBLE);
隐藏/显示发生得如此之快,在我的测试设备上并不明显.当然有一个缺点:虽然进入动画仍然有效,但是上下文操作栏的退出动画会丢失,因为工具栏会立即弹出它.但在我们找到更好的解决方案之前,我想我们会一直坚持下去.
(我的 Activity 实际上扩展了一个自定义的 BaseActivity
类,该类有一个名为 getActionBarToolbar()
的方法,取自 Google I/O 2014 应用程序源代码,所以我可以很容易地获取工具栏:
BaseActivity activity = (BaseActivity) getActivity();activity.getActionBarToolbar().setVisibility(View.GONE);
可惜 I/O 应用程序不使用上下文操作栏.)
I am working on using the newly added Toolbar that was introduced in Lollipop and the AppCompat-v7 library. I followed this guide on setting up the Toolbar I noticed that when you invoke something that will bring up the contextual ActionBar (such as highlighting text for copy/pasting), that it will push the Toolbar down on the page. You can see what I am talking about in the image at the bottom of the page:
So, essentially, I set it up like this. I have the Toolbar defined in an xml file that I use with include tags:
<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"/>
Then, I instantiate it in my view:
<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>
In code, I set it up like so:
// On Create method of activity:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Does anyone know how to make it so that the Contextual ActionBar comes overtop of the Toolbar?
Update:
Solution: use the windowActionModeOverlay property. Set this in your theme:
<item name="windowActionModeOverlay">true</item>
and the actionmode will be shown over the action bar instead of pushing it down. (If you're not using the latest AppCompat then you need to add the "android:" prefix to the property). It basically lets AppCompat know that you have a toolbar located in the top of the screen and that it should draw the ActionMode on top of it.
Old answer/workaround:
I ran into the same problem. No matter what theme I set, it always pushes down the Toolbar I set as ActionBar. I tried with and without the support library, but it didn't matter.
Unfortunately I was not able to fix it so I have built a workaround instead. In my ActionModeCallback
's onCreateActionMode
I hide the action bar:
actionBarToolbar.setVisibility(View.GONE);
and in onDestroyActionMode
I show it again:
actionBarToolbar.setVisibility(View.VISIBLE);
The hiding/showing happens so quickly it is not noticeable on my test devices. There is of course a downside: although the enter-animation still works, the exit-animation of the contextual action bar gets lost because the Toolbar immediately pops over it. But until we come across a better solution I guess we are stuck with this.
(My Activity is actually extending a custom BaseActivity
class which has a method called getActionBarToolbar()
, taken from the Google I/O 2014 app source code, so I can easily get fetch the Toolbar:
BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);
Too bad the I/O app does not use the contextual action bar.)
这篇关于带有 AppCompat-v7 的工具栏和上下文操作栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!