Android应用程序兼容性ActionBar菜单项showAsAction无法正常工作。

25

我有一个菜单项在 Android 4.x 上可以显示,但在 2.x 上不行。这是我的 menu.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<item
    android:id="@+id/menu_filter"
    android:title="Filter"
    app:showAsAction="always"/>  
</menu>

这是我的操作栏样式

<style name="style1_actionBar" parent="@style/Widget.AppCompat.Light.ActionBar">
    <item name="android:background">@color/blue_dark</item>
    <item name="android:textColor">@color/white</item>
    <item name="actionMenuTextAppearance">@color/white</item>
    <item name="background">@color/blue_dark</item>
</style>

有什么想法吗?

编辑:删除了双引号拼写错误

可能是因为我只显示文本而没有图标导致的吗?我有些困惑了。


1
您在 xmlns:app="”http://schemas.android.com/apk/res-auto”" 处出现了错误...请注意开头和结尾处的两个双引号...应该是 xmlns:app="http://schemas.android.com/apk/res-auto"。这可能是一个打字错误 :-) - Gopal Gopi
兄弟,我真的很激动,以为那个解决方案会解决问题,但是没有,即使有了那个修复也是同样的问题。 - pickle_inspector
5个回答

31

谢谢你们的帮助,但是我已经设法搞定了。问题不在xml上,而是在onCreateOptionsMenu函数上。

我之前使用的是:

new MenuInflater(getApplication()).inflate(R.menu.activity_wentry_editor, menu); 

改为这样

MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_wentry_editor, menu);

不是完全明白为什么这个可行,但它确实可行。


第一个不起作用的原因(使用getAppliction())是因为它将使用应用程序上下文,而该上下文不使用AppCompat。当您使用活动的getMenuInflator()时,它将使用AppCompat和您的应用程序命名空间。 - Monte Creasor

19
<menu xmlns:android="http://schemas.android.com/apk/res/android"
  **xmlns:yourapp="http://schemas.android.com/apk/res-auto"** >

    <item android:id="@+id/action_search"
      android:icon="@drawable/ic_action_search"
      android:title="@string/action_search"
      **yourapp**:showAsAction="ifRoom"  />
</menu>
请参阅文档:http://developer.android.com/guide/topics/ui/actionbar.html 使用支持库的XML属性
请注意,上面的showAsAction属性使用在标签中定义的自定义命名空间。当使用支持库定义的任何XML属性时,这是必要的,因为这些属性在旧设备上的Android框架中不存在。因此,您必须使用自己的命名空间作为所有由支持库定义的属性的前缀。

9
在我的情况下,我需要在onCreateOptionsMenu中添加几行代码。
在使用appCompat的同时,Android Studio不允许我使用android:showAsAction="ifRoom"。
而app:showAsAction="ifRoom"并没有起作用,我毫无问题地将其移除了。
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater  inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        for (int i = 0; i < menu.size(); i++) {
            menu.getItem(i).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        }
        return super.onCreateOptionsMenu(menu);
    }

谢谢!这个对我有用! - Innova

0
如果您想让您的应用程序支持3.0以下的操作栏,您需要使用来自支持库的app compact v7。

同时,请检查链接


我正在使用appcompat v7。 - pickle_inspector
我修复了,但是问题仍然存在。 - pickle_inspector
请查看这些教程,希望能对您有所帮助。 http://hmkcode.com/add-actionbar-to-android-2-3-x/ - Android Learner
1
我感觉我在那里做了所有的事情。这真让人沮丧。 - pickle_inspector
只需清理并重新构建您的应用程序,然后在不同的模拟器上尝试它。 - Android Learner

0

在扩展AppCompact的活动中使用菜单时,需要在XML中导入应用上下文并使用它:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <!-- "Mark Favorite", should appear as action button if possible -->
    <item
        android:id="@+id/action_favorite"
        android:icon="@drawable/ic_favorite_black_48dp"
        android:title="@string/action_favorite"
        app:showAsAction="ifRoom"/>

    <!-- Settings, should always be in the overflow -->
    <item android:id="@+id/action_settings"
          android:title="@string/action_settings"
          app:showAsAction="never"/>

</menu>

你需要做的基本上是在XML中的菜单元素中添加xmlns:app="http://schemas.android.com/apk/res-auto",并使用以下格式的showAsActionapp:showAsAction="ifRoom"
这将在可能的情况下在操作栏中显示图标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接