【问题标题】:Android ActionBar compat overflow menu not showing on sdk 10Android ActionBar 兼容溢出菜单未在 sdk 10 上显示
【发布时间】:2013-12-01 10:55:37
【问题描述】:

您好,感谢您花时间阅读此问题。

我正在尝试开发一个将使用 ActionBar 兼容库的 android 应用程序。在使用 compat 库时,我已遵循(据我所知)所有建议。我的清单看起来像这样(仅显示相关代码):

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"        
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application            
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.Light" >

    </application>

</manifest>

如您所见,我的目标是 sdk 8+。我已按照推荐使用 Theme.AppCompat 主题。

我的菜单文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cds="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_map"
        android:icon="@drawable/ic_action_map"
        android:title="@string/action_map"
        cds:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:title="@string/action_search"
        cds:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_mail"
        android:icon="@drawable/ic_action_mail"
        android:title="@string/action_mail"
        cds:showAsAction="ifRoom"/>

</menu>

我正在为 showAsAction 属性使用我自己的命名空间。

我的活动扩展了 ActionBarActivity 类。

问题是这样的:在 sdk 10 (android 2.3.3) 上,无论是在设备上还是在模拟器上,都没有显示溢出菜单(操作栏右侧的三个点)。只有前 2 个菜单项显示在操作栏上。如果我按下设备上的“菜单”按钮,那么第三个项目会从屏幕的左下角显示(而不是在具有更新的 android 版本的设备上从右上角显示)。相同的代码在模拟器上的 android sdk 17 上运行良好(溢出菜单显示为正确的操作)。

我已在网上搜索解决方案,但找不到解决此特定问题的解决方案。如果我没有在 android 2.3.3 设备上安装具有相同操作栏并且显示溢出菜单图标并且像在任何最近的 android 设备上一样正常工作的应用程序,我会放弃这个问题。此应用程序的一个示例是 todoist 应用程序 (https://en.todoist.com/android) 或 handcent 应用程序 (https://play.google.com/store/apps/details?id=com.handcent.nextsms&hl=en),它们都在此设备上运行良好。

有什么我遗漏的,还是有替代解决方案来替代使用操作栏兼容的推荐方式?

感谢您的宝贵时间。

【问题讨论】:

    标签: android android-sdk-2.3 android-actionbar-compat


    【解决方案1】:

    @Andrei Google 已禁用 pre honycomb 上 appcompat 中的菜单溢出按钮。 如果你真的想添加它去 android 的 github 存储库并下载 平台_框架_支持。它在 platform_framework_support_master/v7/appcompat 中包含 appcompat 的源代码。

    在 appcompat 中创建一个 libs 文件夹并放入最新的 android-support-v4.jar。 现在打开文件v7/appcompat/src/android/support/v7/internal/view/ActionBarPolicy.java。 您将看到 showOverflowMenuButton 对于 pre honycomb 返回 false。只需将其返回 true 并将此编辑的 appcompat 作为库添加到您的项目中 而且您不需要任何自定义溢出按钮 这对我有用。 对不起我的英语

    编辑:来自android/support/v7/internal/view/ActionBarPolicy.java的实际代码

    public boolean showsOverflowMenuButton() {
        // Only show overflow on HC+ devices
        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
    }
    

    【讨论】:

    • 感谢您的回答。正如我在下面所写的,我为这个项目选择了一个“拆分操作栏”,但我会在我未来的项目中尝试你的解决方案。当我完成足够的测试时,我会通知你。
    • 谷歌为什么要做这样的事情?真的没有其他方法可以做到这一点,我不喜欢你的建议是支持库的新更新不会自动安装......
    【解决方案2】:

    尝试像我一样展示。

    我手动添加溢出菜单(三个点):

    <item
        android:id="@+id/menu_more"
        android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_light"
        android:title="@string/action_settings"
        myapp:showAsAction="always">
        <menu>
            <item
                android:id="@+id/submenu_about"
                android:showAsAction="always"
                android:title="@string/menu_about"/>
        </menu>
    </item>
    

    并覆盖活动中的菜单按钮单击以显示此菜单(来自Opening submenu in action bar on Hardware menu button click 的解决方案):

    private Menu mainMenu;    
    
    ...
    
    @Override
        public boolean onKeyUp(int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_UP) {
                switch (keyCode) {
                case KeyEvent.KEYCODE_MENU:
    
                    mainMenu.performIdentifierAction(R.id.menu_more, 0);
                    return true;
                }
    
            }
            return super.onKeyUp(keyCode, event);
        }
    

    2.2 的结果如下:

    希望对你有帮助。

    【讨论】:

    • 首先很抱歉延迟回答这个问题。在过去的几个月里,我做了很多工作,没有时间正确回答你。很抱歉,我已经尝试过您的解决方案,但没有奏效。 “不起作用”是指所有设备上的结果都不相同。在蜂窝之前,“设置”下拉菜单出现在屏幕中间的某处,而不是从右上角下降。我为这个项目选择了一个“拆分操作栏”,因为我主要担心的是蜂窝设备之前的用户不会知道菜单还有其他选项。
    • 感谢您的回复。你是对的,菜单出现在屏幕中间。我还没有找到正确的解决方案。
    【解决方案3】:

    我终于找到了这种情况的答案。

    您需要做的就是在您的活动中的 OnCreate 中调用以下内容

    ActionBarPolicy.get(this).showsOverflowMenuButton();
    

    【讨论】:

    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多