问题
我想要覆盖来自Android命名空间的布局文件,例如R.layout.popup_menu_item_layout
(在代码中引用为com.android.internal.R.layout.popup_menu_item_layout
)。通过说“覆盖”,我假设在项目中声明一个xml
文件,该文件将优先于框架拥有的布局。
请注意,这只是一个示例布局,因此问题涉及到sdk/platforms/android-XX/data/res/layout
目录中存在的每个布局。
我尝试过的方法
tools:override
有一个未记录的tools:override
标签可用,它可以覆盖特定的资源。请参见此答案中的示例,该示例覆盖了来自Design Support Library而非Android框架的值。
将tools:override="true"
应用于布局的根标记将不会生效。
XML布局引用 - refs.xml
如this所述,声明一个/values/
目录下的refs.xml
文件,并包含以下内容:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="layout" name="activity_main">@layout/activity_second</item>
</resources>
一旦使用activity_main.xml
,将会引用activity_second.xml
。有一个答案建议使用这种技术来替换Snackbar
的布局。
这也不会生效。
问题
是否有合法的方法可以覆盖/替换Android包中的布局文件?
PopupMenu
使用SomeClassA
,SomeClassA
又使用SomeClassB
,最终导致这个布局被充气),这意味着我必须坚持多级反射,希望我能找到足够的接缝来实现所需的效果。不过还是谢谢你的回复。 - azizbekianandroid.view.View
和带有native
方法的东西)。对于后者,你只能寻找其他解决方案来解决整体问题。因此,例如我通过这种方式分支了Android 7.0的网络安全配置的全部内容,丢弃了在旧设备上无法使用的部分,作为创建后移的一部分。 - CommonsWare