【问题标题】:Toolbar and Contextual ActionBar with AppCompat-v7带有 AppCompat-v7 的工具栏和上下文操作栏
【发布时间】:2014-12-14 02:56:03
【问题描述】:

我正在使用 Lollipop 和 AppCompat-v7 库中引入的新添加的工具栏。我在设置工具栏时关注this guide,我注意到当您调用一些会调出上下文操作栏(例如突出显示文本以进行复制/粘贴)时,它会将工具栏向下推到页面上。你可以在页面底部的图片中看到我在说什么:

所以,基本上,我是这样设置的。我在包含标签的 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 超越工具栏?

【问题讨论】:

  • 您的活动使用什么主题?
  • 大卫,我刚刚点击了链接,它似乎对我有用。

标签: android android-5.0-lollipop android-appcompat android-toolbar


【解决方案1】:

更新:

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

<item name="windowActionModeOverlay">true</item>

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


旧答案/解决方法:

我遇到了同样的问题。无论我设置什么主题,它总是将我设置为 ActionBar 的 Toolbar 下推。我尝试了有无支持库,但没关系。

不幸的是,我无法修复它,因此我构建了一个解决方法。在我的ActionModeCallbackonCreateActionMode 中,我隐藏了操作栏:

actionBarToolbar.setVisibility(View.GONE);

并在onDestroyActionMode我再次显示:

actionBarToolbar.setVisibility(View.VISIBLE);

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


(我的活动实际上是扩展了一个自定义的BaseActivity 类,该类有一个名为getActionBarToolbar() 的方法,取自Google I/O 2014 app source code,因此我可以轻松获取工具栏:

BaseActivity activity = (BaseActivity) getActivity();
activity.getActionBarToolbar().setVisibility(View.GONE);

可惜 I/O 应用不使用上下文操作栏。)

【讨论】:

  • 是的,这也是我能想到的唯一解决方案。但是,在某些情况下 Contextual ActionBar 发生在系统中(例如在 WebView 中或使用 EditText)。那些你没有得到回调的人。那么,您将如何为此显示/隐藏它? (或者我错了,事实上,你可以用这些来获取 CAB 的回调)?
  • 是的,您可以为此 TextView.setCustomSelectionActionModeCallback(),就像 Aleksandar 在他的回答中描述的那样。
  • 哦,已经不能更新我的评论了。小补充:似乎 setCustomSelectionActionModeCallback 不能与支持库中的 ActionModeCallback 一起使用。我正在使用 VERSION.SDK_INT 检查来设置它。仍然需要测试问题是否也出现在之前的 Honeycomb 设备上。
  • @ariets 请查看我的更新答案。我为完全忘记了该属性而感到有点倾倒,但至少我们现在可以摆脱解决方法;-)
  • 有趣的是我正在使用最新的(编译'com.android.support:appcompat-v7:22.0.0'),但我必须省略 android: 部分才能工作......
【解决方案2】:

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

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.startActionMode(mActionModeCallback)

你必须使用

<item name="windowActionModeOverlay">true</item>

【讨论】:

  • 对我来说它适用于 android.support.v7.app.ActionBar
  • 我收到此错误-> View 中的 startActionMode (android.view.ActionMode.Callback) 无法应用于 (android.support.v7.view.ActionMode.Callback)
  • 啊,好吧。我的最小版本不小于 11。所以我可以使用 android.view.ActionMode。 android.support.v7.widget.Toolbar 上的回调,我从未使用过 android.support.v7.view.ActionMode.Callback。
  • 值得一提的是AppCompatActivity.startSupportActionMode(callback),以便与菜单项xmls中的app:iconTint等属性兼容。
【解决方案3】:

只是一个小补充: 为了

<item name="windowActionModeOverlay">true</item>
在您的活动中调用super.onCreate(savedInstanceState) 之前 调用setContentView(R.layout.your_activity) 很重要。 在这种情况下真的很重要!

【讨论】:

    【解决方案4】:

    就我而言, &lt;item name="windowActionModeOverlay"&gt;true&lt;/item&gt;没用, 但这项工作:&lt;item name="android:windowActionModeOverlay"&gt;true&lt;/item&gt;android 是关键。

    【讨论】:

    • 您将&lt;item name="windowActionModeOverlay"&gt;true&lt;/item&gt; 与appcompat 工具栏一起使用,否则您将使用android 命名空间。
    • 在我的布局中添加工具栏对我没有用,在活动初始​​化工具栏和 setsupport true 完成请帮助我
    • true 按预期工作!
    【解决方案5】:

    Jacob 的解决方案对我有用,但上下文 ActionBar 是透明的,并且通过它可以看到 Toolbar。可以通过以下方式解决:

    <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 样式的更多详细信息:

    how to Customize the Contextual Action Bar using appCompat in material design

    【讨论】:

      【解决方案6】:

      将工具栏置于最前面的非常有用的方法toolbar.bringToFront()

      【讨论】:

      • View.bringToFront() 是非常繁重的操作,通常应不惜一切代价避免。
      • 你说得对,但是对于动画来说,例如从上到下的屏幕将与工具栏重叠。因此,我们需要使用toolbar.bringToFront() 来为工具栏下方设置动画。如果有其他方式可以分享:)
      【解决方案7】:

      另一个小补充:如果您以片段 (ft.replace(android.R.id.content, fragment)) 加载整个 ui,请确保通过 setContentView(R.layout.empty_screen) 在 Activity 中设置至少一个空白屏幕。

      【讨论】:

        猜你喜欢
        • 2014-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 2014-12-22
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        相关资源
        最近更新 更多