如何从另一个模块调用布局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.R
或com.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
类)具有唯一的包名称在应用程序模块内)隐藏另一个。由于 R
class 的生成性质,如果您想为资源使用相同的名称,则必须为不同的 Android 模块使用不同的 packageId。【参考方案2】:
我认为您正在寻找的是 http://developer.android.com/tools/projects/index.html 的开发注意事项部分
根据资源,您不能在不同的模块中拥有 2 个称为相同的布局:即使您的 R 文件已正确命名空间,一个也会覆盖另一个。这是非常令人失望的行为,但看起来唯一的解决方法就是添加前缀。
【讨论】:
你是对的。如果我们使用模块,通常一个模块会导入另一个模块,并且 Resource (R.java) 将首先导入并且将省略命名空间。所以不要使用相同的布局名称。【参考方案3】:啊哈,记得将 CustomView 设为公开。我错过了几个小时。
【讨论】:
以上是关于如何从另一个模块调用布局xml的主要内容,如果未能解决你的问题,请参考以下文章
Magento 2 - 如何在另一个 phtml 文件、xml 布局、静态块和 cms 页面中调用自定义 phtml 文件?