使用AppCompat时,为什么需要在菜单项中使用app命名空间

时间:2015-05-13 17:49:03

标签: android actionbarsherlock android-appcompat

以前,在使用AppCompat之前,我使用SherlockActionBar来支持Android 2.3。

以下菜单在SherlockActionBar

下完美无缺
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item 
        android:id="@+id/menu_browser"
        android:title="@string/menu_browser"
        android:showAsAction="ifRoom"
        android:icon="?attr/actionBarBrowserIcon"/>
    <item 
        android:id="@+id/menu_share"
        android:title="@string/menu_share"
        android:showAsAction="ifRoom"
        android:icon="?attr/actionBarShareIcon"/> 
</menu>

然而,即使迁移到AppCompat,我也意识到上面的菜单不起作用。我需要使用app命名空间,以使其工作。

<?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_browser"
        android:title="@string/menu_browser"
        app:showAsAction="ifRoom"
        android:icon="?attr/actionBarBrowserIcon"/>
    <item 
        android:id="@+id/menu_share"
        android:title="@string/menu_share"
        app:showAsAction="ifRoom"
        android:icon="?attr/actionBarShareIcon"/> 
</menu>

为什么会这样?与SherlockActionBar相比有什么不同,这会使app名称空间不必要?

1 个答案:

答案 0 :(得分:0)

库提供的属性(或应用程序本身)假定为名称空间,以避免冲突/冲突。

ActionBarSherlock通过命名属性android:showAsAction来屏蔽此行为。 (与showAsAction命名空间中的android属性相对):https://github.com/JakeWharton/ActionBarSherlock/blob/master/actionbarsherlock/res/values/abs__attrs.xml