如何从另一个模块调用布局xml

Posted

技术标签:

【中文标题】如何从另一个模块调用布局xml【英文标题】:How to call layout xml from another module 【发布时间】: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 吗?

【问题讨论】:

【参考方案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 设为公开。我错过了几个小时。

【讨论】:

以上是关于如何从另一个模块调用布局xml的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个组件调用 VueJS 组件

如何从另一个函数进行异步函数调用?

如何从另一个布局中获取按钮的文本值?

如何从另一个域加载 xml 数据

Magento 2 - 如何在另一个 phtml 文件、xml 布局、静态块和 cms 页面中调用自定义 phtml 文件?

使用 DialogFragment 从布局 xml 调用方法。它是如何工作的?