【问题标题】:Whats the use of app namespace in android xmlandroid xml中app命名空间的用途是什么
【发布时间】:2016-03-16 18:44:51
【问题描述】:

下面是activity中显示菜单的代码(Sunshine udacity android课程的DetailFragment.xml)

我不明白为什么下面需要两个不同的命名空间。为什么我不能使用命名空间 android: 而不是 app:

当我替换时在下面的 xml 部分 app:actionProviderClass="android.support.v7.widget.ShareActionProvider" 和 app:actionProviderClass="android.widget.ShareActionProvider"

它似乎给出了一些分配错误,但如果应用程序更改为 android 则工作正常,如下所示 android:actionProviderClass="android.widget.ShareActionProvider"

我无法理解这里到底发生了什么。

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_share"
        android:title="@string/action_share"
        app:showAsAction="always"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
</menu>

【问题讨论】:

    标签: android xml namespaces shareactionprovider


    【解决方案1】:

    ShareActionProvider 有两个版本,the android framework's 和 v7 support library's。

    在Sunshine中你需要支持min SDK version 10,而ShareActionProvider是从API level 14开始添加到框架中的,那么如何向SDK 10-13提供该功能呢?您改用the support library 版本。

    你在这里导入 build.gradle 中的支持库

    dependencies {
        ...
        compile 'com.android.support:appcompat-v7:21.0.2'
    }
    

    现在回到关于应用命名空间的问题。 Sunshine在他们支持的下层SDK上使用了框架中没有的属性(actionProviderClass和showAsAction),所以需要使用支持库提供的自定义属性,并使用 strong>自定义属性,您需要使用 app 命名空间。 android 命名空间 是为建议的名称的框架属性。

    <?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/action_share"
            android:title="@string/action_share"
            app:showAsAction="always"
            app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
    </menu>
    

    【讨论】:

    • 谢谢!那么 app 是自定义属性命名空间的标准关键字还是我们可以使用任何单词作为命名空间?
    • 您实际上可以使用任何单词,但您可以通过使用标准应用程序来避免大脑思考。实际上,在 Android Studio 中,如果您键入“app”,那么它会尝试使用“appNs”快捷方式为您自动完成整行,这样您也可以省去打字的麻烦!
    • @ChetaGowda 如果您觉得我的解释有帮助,您是否介意接受我的回答作为您的解决方案。 :)
    • 完成。感谢您的帮助。
    • @KenRatanachaiS。先生,android是如何知道哪个自定义属性属于哪个外部库的?
    【解决方案2】:

    我目前也和你一样参加 Udacity 课程。我在 detailFragment.xml 中指定 actionProviderClass 时遇到问题。结果 actionProviderClass 属性必须使用应用名称的命名空间。我认为这可能是您正在寻找的解决方案。

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android = "http://schemas.android.com/apk/res/android"
          xmlns:Sunshine = "http://schemas.android.com/apk/res-auto">
        <item
            android:id = "@+id/action_share"
            android:title = "@string/action_share"
            Sunshine:actionProviderClass = "android.support.v7.widget.ShareActionProvider"
            Sunshine:showAsAction = "always"/>
    </menu>
    

    注意 actionProviderClass 属性正在使用 app 名称的命名空间。

    解决方法来自:link。第一个答案

    还要确保应用的 build.gradle 与 link 相同

    【讨论】:

    • 命名空间不必是应用名称。事实上,对支持库支持的属性使用 app 命名空间是最佳实践。
    【解决方案3】:

    support.v7 是兼容旧的 Android 版本。要使用它,您需要添加一个 Gradle 依赖项:

    dependencies {
            compile 'com.android.support:appcompat-v7:23.0.1'
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2010-10-09
      • 2011-03-23
      相关资源
      最近更新 更多