Toolbar and Contextual ActionBar with AppCompat-v7
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.)
Do not start it on your activity, but on your toolbar. In you activity:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)
and you have to use
<item name="windowActionModeOverlay">true</item>
Just a small addition: For
<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!
In my case,
<item name="windowActionModeOverlay">true</item>
did not work,
but this work:<item name="android:windowActionModeOverlay">true</item>
,the android
is the key.
Jacob's solution worked for me but the contextual ActionBar was transparent and the Toolbar visible through it. This can be resolved as follows:
<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>
The theme "AppTheme.Base" must be the one applied to the Toolbar.
More details regarding contextual ActionBar styling:
how to Customize the Contextual Action Bar using appCompat in material design