【问题标题】:How to call layout xml from another module如何从另一个模块调用布局xml
【发布时间】:2015-06-21 23:00:13
【问题描述】:

我将 MainActivity 中的 ContentView 设置为 setContentView(R.layout.activity_main);

我在包中还有其他模块,对于我在 gradle 文件 apply plugin: 'com.android.library' 中定义的那个模块,这曾经也有 res/layout/activity_main.xml

那么我可以从 MainActivity 的另一个模块调用 activity_main.xml 吗?

【问题讨论】:

    标签: android android-layout android-fragments android-activity android-gradle-plugin


    【解决方案1】:

    可以,但是您的模块必须有另一个 Android packageId(编辑:只是为了确保您在 Android 清单中声明您的 packageId)。 所以例如你的应用程序模块有com.example.app,你的库有com.example.lib。然后您可以通过com.example.app.Rcom.example.lib.R 访问您的资源ID。 因此,您的库模块中的布局将有 com.example.lib.R.layout.activity_main

    【讨论】:

    • thnx,如果我重命名文件,它工作正常。我正在调用导航抽屉,所以我可以看到抽屉打开。例如com.example.lib.R.layout.activity_main_drawer 但如果我只是说com.example.lib.R.layout.activity_main 它仍然会从应用程序调用activity_main。有什么原因吗?
    • 您确定两个清单中的 packageId 不同了吗?否则你看不到同名的库资源,如果它们都在同一个 packageId 中,因此都在不同的com.example.lib.R 类中。
    • 是的,我在两者中都添加了这些。例如package="com.example.lib" 只有同名时才不起作用
    • 是的,它必须发生,因为在 Java/Android 中,您必须为具有相同名称的类或由 ClassLoader 首先加载的类(在您的情况下为 R 类)具有唯一的包名称在应用程序模块内)隐藏另一个。由于 Rclass 的生成性质,如果您想为资源使用相同的名称,则必须为不同的 Android 模块使用不同的 packageId。
    【解决方案2】:

    我认为您正在寻找的是 http://developer.android.com/tools/projects/index.html 的开发注意事项部分

    根据资源,您不能在不同的模块中拥有 2 个称为相同的布局:即使您的 R 文件已正确命名空间,一个也会覆盖另一个。这是非常令人失望的行为,但看起来唯一的解决方法就是添加前缀。

    【讨论】:

    • 你是对的。如果我们使用模块,通常一个模块会导入另一个模块,并且 Resource (R.java) 将首先导入并且将省略命名空间。所以不要使用相同的布局名称。
    【解决方案3】:

    啊哈,记得将 CustomView 设为公开。我错过了几个小时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      相关资源
      最近更新 更多