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

ari*_*ets 179 android android-appcompat android-5.0-lollipop android-toolbar

我正在使用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"/>
Run Code Online (Sandbox Code Playgroud)

然后,我在我的视图中实例化它:

<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>
Run Code Online (Sandbox Code Playgroud)

在代码中,我这样设置:

    // On Create method of activity:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)

有没有人知道怎么做才能让Contextual ActionBar超越工具栏?

工具栏和上下文ActionBar

Jac*_*Ras 317

更新:

解决方案:使用windowActionModeOverlay属性.在您的主题中设置:

<item name="windowActionModeOverlay">true</item>
Run Code Online (Sandbox Code Playgroud)

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


旧答案/解决方法:

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

不幸的是我无法解决它,所以我建立了一个解决方法.在我ActionModeCallbackonCreateActionMode隐藏动作栏中:

actionBarToolbar.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

onDestroyActionMode我再次展示:

actionBarToolbar.setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)

隐藏/显示发生得如此之快,在我的测试设备上并不明显.当然有一个缺点:尽管输入动画仍然有效,但是上下文操作栏的退出动画会丢失,因为工具栏会立即弹出它.但在我们遇到更好的解决方案之前,我想我们仍然坚持这一点.


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

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

太糟糕了,I/O应用程序不使用上下文操作栏.)


Fra*_*ank 15

不要在您的活动上启动它,而是在工具栏上启动它.在你的活动中:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)
Run Code Online (Sandbox Code Playgroud)

你必须使用

<item name="windowActionModeOverlay">true</item>
Run Code Online (Sandbox Code Playgroud)


Dan*_*ann 14

只是一个小小的补充:为

<item name="windowActionModeOverlay">true</item>
Run Code Online (Sandbox Code Playgroud)在你的活动中打电话super.onCreate(savedInstanceState) 之前打电话很重要setContentView(R.layout.your_activity).这种情况真的有所作为!


Jen*_*kyn 11

在我的情况下, <item name="windowActionModeOverlay">true</item>没有工作,但这项工作:<item name="android:windowActionModeOverlay">true</item>,android是关键.

  • 你使用appcompat工具栏使用`<item name ="windowActionModeOverlay"> true </ item>`,否则你使用`android`命名空间. (8认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)

主题"AppTheme.Base"必须是应用于工具栏的主题.

有关上下文ActionBar样式的更多详细信息:

如何在材料设计中使用appCompat自定义上下文操作栏