【问题标题】:Create android resource library with custom namespace like android.R?使用自定义命名空间(如 android.R)创建 android 资源库?
【发布时间】:2016-10-28 12:42:19
【问题描述】:

我正在开发一个 Android 项目(使用 Android Studio、Gradle),我将一些逻辑和小部件拆分为子库项目。

我发现 R.string.xxx 或其他 R 引用已合并,但如果我的库与应用程序模块同名,我无法获取它的资源值。 (我使用了[libpacakgename].R.string.appname,但资源仍然是应用模块的,而不是库的。)

有没有办法使用像 Android 资源这样的资源:@​​987654324@,或者像 myapp:string/xxx 这样的 xml,其中“myapp”成为我的自定义命名空间或类名。

对了,我也发现有时候attr id会发生冲突,导致编译失败。

【问题讨论】:

  • "有没有办法使用像Android资源这样的资源:android.R.string.xxx,或者像myapp:string/xxx这样的xml,其中“myapp”成为我的自定义命名空间或类名“——我不知道。库是一种组织工具,但库中的所有内容都会合并到主应用程序中。应用程序需要能够覆盖库中的资源,因为库的值可能不适合应用程序的场景。您可以使用前缀和public.xml 来帮助避免意外覆盖,仅此而已。
  • @CommonsWare 我知道这是一个老评论,但我还是想表达我的意见。想象一下,将 Java 包作为一种组织工具,但无论如何,一切都会合并到一个全局包中。我发现这在 Android 上非常令人沮丧。如果 Android 可以保留其命名空间,那么它也没有理由不能对库执行此操作,除非这是一个深思熟虑的设计决定。至少我是这么看的,也许我错过了什么。
  • 更糟糕的是,关于此关键部分的文档无处可寻。例如,“app”命名空间声明中的“res-auto”可能代表“自动解析”,它解析清单中指定的包名称。 (至少,我认为确实如此。)
  • 'style' 属性是唯一没有命名空间的属性是什么?是不是因为它只是一个简单的替换机制,只是内联了样式中指定的所有属性?为什么在样式中省略命名空间意味着使用“app”命名空间,而您需要为Android属性指定“android”命名空间?这只是一团糟。找到这个问题也花了我很长时间。无论我在 Google 上搜索什么,我得到的只是“只需输入这个,它就可以工作”的资源。大吵大闹。

标签: java android android-resources android-library


【解决方案1】:

这可能通过修改内部 gradle 任务来实现,但这不是预期的场景。

一个简单的解决方案是为库资源标识符添加前缀,例如(包)名称。

【讨论】:

    猜你喜欢
    • 2020-09-19
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    相关资源
    最近更新 更多