AppCompat v21,MenuInflater和showAsAction菜单首选项

Vek*_*r88 1 android android-appcompat android-menu android-support-library

我正在将我的应用程序迁移到最新的v7支持库,并提供材料设计支持.

我有一个简单的菜单,我希望在我的菜单中显示ActionBar.

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/platformselect_button_settings"
        android:icon="@drawable/ic_action_settings"
        android:orderInCategory="1"
        android:showAsAction="always"
        android:title="@string/menu_settings"/>
</menu>
Run Code Online (Sandbox Code Playgroud)

问题是showAsAction首选项被忽略,我必须做的是使其工作是强制onCreateOptionsMenu方法中的首选项:

@Override
public boolean onCreateOptionsMenu(Menu menu){
    getMenuInflater().inflate(R.menu.platformselect_overflow_menu, menu);
    for(int i = 0;i<menu.size();i++){
        MenuItemCompat.setShowAsAction(menu.getItem(i), MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
    }
    return super.onCreateOptionsMenu(menu);
}
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?为什么忽略存储在XML中的首选项?

Kuf*_*ffs 5

使用AppCompat时,您需要使用不同的命名空间.

试试这个:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/platformselect_button_settings"
        android:icon="@drawable/ic_action_settings"
        android:orderInCategory="1"
        app:showAsAction="always"
        android:title="@string/menu_settings"/>
</menu>
Run Code Online (Sandbox Code Playgroud)

来自这里的文档:http: //developer.android.com/guide/topics/ui/actionbar.html#ActionItems

使用支持库中的XML属性 请注意,上面的showAsAction属性使用标记中定义的自定义命名空间.在使用支持库定义的任何XML属性时,这是必需的,因为旧设备上的Android框架中不存在这些属性.因此,您必须使用自己的命名空间作为支持库定义的所有属性的前缀.