【发布时间】:2017-11-19 05:48:00
【问题描述】:
问题
我想覆盖 android 命名空间中的布局文件,例如R.layout.popup_menu_item_layout(即referenced from code 和com.android.internal.R.layout.popup_menu_item_layout)。通过说 override,我假设在项目中声明一个 xml 文件,该文件将优先于框架拥有的布局。
注意,这只是一个示例布局,因此问题涉及sdk/platforms/android-XX/data/res/layout 目录中存在的每个布局。
我尝试过的
工具:覆盖
有一个undocumented tools:override 标记可用,它会覆盖特定资源。有关示例,请参阅 this 答案,它会覆盖来自 Design Support Library 的值,not 来自 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。有an answer 建议使用这种技术来替换Snackbar 的布局。
这也不会生效。
问题
是否有任何合法的方法可以覆盖/替换 android 包中的布局文件?
【问题讨论】:
-
如果您是膨胀布局的人,只需修改您的代码以使用替换。如果您试图替换其他正在膨胀的布局(例如,
PopupMenu),那么 AFAIK 是不可能的。您可以尝试分叉该类并创建自己的版本,然后使用您的替换布局。 -
通常这些 API 隐藏在公共 API 之后(
PopupMenu使用SomeClassA,它使用SomeClassB,这会扩大这种布局),这意味着我必须坚持多层次反思,希望能找到足够多的接缝,达到想要的效果。不过感谢您的回复。 -
你最终也会分叉这些。最终,你要么得到一整套类,要么遇到不可分叉的东西(例如,
android.view.View,使用native方法的东西)。在后一种情况下,您继续前进并以其他方式解决您的整体问题。因此,例如,我以这种方式分叉了the entirety of Android 7.0's network security configuration,丢弃了不能在旧设备上使用的位,作为创建反向移植的一部分。 -
您是否尝试过简单地将布局文件复制到您的代码库中?名称必须保持不变,如果你有多个布局大小来复制它们,你也需要小心。您还必须解决沿途出现的所有尺寸错误。我记得当我需要从 google cast 支持库(媒体控制器)修改活动中的布局时,这对我有用,这样我就能够摆脱 2 窗格布局并更改颜色、品牌......一切。
-
你有没有尝试在你的项目中添加一个包名为“com.android.internal”的模块库,这将生成你自己的com.android.internal.R,尽管编译如何解决依赖冲突,也许您可以覆盖布局链接?
标签: android xml android-layout android-resources aapt