如何在 android actionbar compat 上强制溢出菜单?

Posted

技术标签:

【中文标题】如何在 android actionbar compat 上强制溢出菜单?【英文标题】:How to force overflow menu on android actionbar compat? 【发布时间】:2012-02-04 04:59:09 【问题描述】:

android action bar compat 可能吗?在较旧的设备(3.0 之前)上,不适合操作栏的项目仅在按下菜单键时显示,我希望将这些项目分组在操作栏的溢出菜单中。

【问题讨论】:

来自 ABS 更改日志 CHANGELOG.md:27:* 修复:删除 .ForceOverflow 主题。这些不应该被包括在内。 【参考方案1】:

操作溢出菜单仅在设备上没有可用的硬菜单按钮时可用。我在“用户界面”>“操作栏”下的“框架主题”中发现了这一点,请查看第三个项目符号 here。

Jake Wharton 写的动作栏库叫做 ActionBarSherlock。即使在较旧的设备(包括硬菜单按钮)上,这也可能为您提供操作溢出菜单样式,但是我没有对此进行研究。

编辑: ActionBarSherlock 4.0(目前是一个候选版本)内置了强制动作溢出的功能。如果您想自己扩展 ActionBarCompat 示例,您可以查看 github 以了解 Jake 是如何实现它的。我建议只是考虑一起使用他的库,因为它做得很好。

如果您选择使用 Jake 的库,请考虑将 Activity 主题设置为 @style/Theme.Sherlock.ForceOverflow 以在旧设备上强制溢出菜单。

Edit2: 使用ForceOverflow 主题会导致带有硬件菜单按钮的设备出现问题 (example #1)。因此,Jake Wharton 将在未来的版本中删除 ForceOverflow

【讨论】:

你没有仔细阅读这个问题。他正在使用官方的 android 操作栏库来获得向后和向前兼容性。他想在 Android 4.0 以下强制使用溢出选项,而不是将他的旧菜单变成 ICS 上的功能菜单。 @EricNovins,ABS 库提供了他正在寻找的东西。如果他选择不使用该库,if 为他提供了以自己的方式扩展 ActionBarCompat 的方向。 我永远不会建议完全放弃图书馆。这是一个功能的大量重新编码。不是一个高质量的答案 IMO 但是 Google 怎么能在 Google+ 上使用操作溢出呢?我使用的是 Nexus S,它有硬菜单按钮,所以溢出不应该在那里......无论如何我在几乎所有的股票差距上都看到它 @Shine 即使您有硬菜单按钮,开发人员也可以强制显示溢出按钮。这只会在所有设备上提供一致的 UI,即使它们是 ICS 之前的设备。【参考方案2】:

好的,这很简单,但很难弄清楚。

您首先需要一个要用作溢出充气器的菜单项。示例

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

一旦你有了你的项目,在溢出菜单中添加一个包含你想要的项目的子菜单。示例:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

点击后会膨胀其中的其他项目。我的应用程序使用的是 ActionBarSherlock 4.0,所以在这对您有用之前,您需要访问“SplitActionBar”。 (仍可在默认的 android Actionbar 上使用)

方法如下: 在您的 AndroidManifest.xml 文件中,您需要在需要溢出菜单的活动下添加此代码。 老实说,是否拆分操作栏并不重要,但我更喜欢它。

android:uiOptions="splitActionBarWhenNarrow"

注意:使溢出菜单膨胀的项目必须showAsAction="always"

沃拉!你有一个溢出菜单!希望我能帮到你。 :)

【讨论】:

这不起作用。我无法让它显示垂直溢出菜单图标(3 个垂直框,意思是:“点击我查看溢出菜单”)。他们仍然进入硬件菜单按钮 太棒了,对于我的应用,您的示例完美运行! 太棒了!对于习惯了老式风格的人来说,这很好。对于能够适应不断变化的技术的年轻一代来说,这并不是什么大问题,但老年人很难弄清楚这些东西。很难向他们解释,如果有硬件按钮,他们就不会看到 GUI 按钮——所以实现起来更容易。【参考方案3】:

按照 LeviRockerSk8er 的建议,我不得不在操作栏中设置一个溢出菜单,如下所示:

这是“menu.xml”的代码:

<item
    android:id="@+id/web_clasica"
    android:icon="@drawable/ic_action_web_site"
    android:showAsAction="ifRoom"
    android:title="@string/menu_web"
    />
<item
    android:id="@+id/overflow_fijo"
    android:icon="@drawable/ic_action_core_overflow"
    android:showAsAction="always"
    android:title="@string/menu_email"
   >
   <menu>
    <item
    android:id="@+id/email"
    android:icon="@drawable/ic_action_new_email"
    android:showAsAction="ifRoom"
    android:title="@string/menu_email"
   />
    <item
    android:id="@+id/share"
    android:icon="@drawable/ic_action_share"
    android:showAsAction="ifRoom"
    android:title="@string/menu_share"
    />
    <item
    android:id="@+id/about"
    android:showAsAction="ifRoom"
     android:icon="@drawable/ic_action_action_about"
    android:title="@string/menu_about"/>
</menu>

【讨论】:

它可以工作,但是当我在活动中的 android:uiOptions 中添加提及“splitActionBarWhenNarrow”时,它总是在底部显示栏。 在 skd 10 及以下的溢出不显示为下拉菜单,而是显示为中心的列表。除此之外,这种方法还有效。 似乎您必须将菜单项作为第二项。如果您只有它,那么它会显示为旧菜单,从硬件键调用。

以上是关于如何在 android actionbar compat 上强制溢出菜单?的主要内容,如果未能解决你的问题,请参考以下文章

如何让使用了ActionBar的app支持Android 2.x的设备

Android 如何隐藏ActionBar,保留标题栏

Android基础——ActionBar

如何隐藏默认片段 actionBar 在 android & kotlin 中创建我们自己的 actionBar

android如何去掉actionbar

如何在Android中将ActionBar添加到Activity