我试图使用运行时资源覆盖( Resource,RRO)定制Android10AOSPSettings应用程序(com.android.settings)。在使用RRO时,我可以通过在RRO的文件./res/values/strings.xml中添加一个新值来成功地自定义设置应用程序中的任何字符串。
但是,我不能通过将布局文件放置在RRO的./res/layout/文件夹中来覆盖布局而不是字符串而是布局。
RRO是生成的,但是it与原始布局中的it不同,所以在设备上安装RRO之后,Settings应用程序将无法使用findViewById()在布局文件中找到它希望的元素。
例如,我在其bluetooth_pin_confirm.xml中创建了一个包含以下res/layout/folder布局文件(复制自Settings应用程序源代码和简化)的RRO
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/pairing_caption"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
...
</LinearLayout>在设备上安装RRO之后,“设置”应用程序将成功地在BluetoothPairingDialogFragment.java中膨胀此文件
View view = getActivity().getLayoutInflater().inflate(R.layout.bluetooth_pin_confirm, null);但是,它将无法通过id找到视图:
TextView pairingViewCaption = (TextView) view.findViewById(R.id.pairing_caption);找不到R.id.pairing_caption,因此pairingViewCaption将为空
因此,来自RRO的布局文件中的it似乎与原始it不同。
实际上,当在Settings应用程序apk上运行aap2转储时,我可以看到:
resource 0x7f0a02e0 com.android.settings:id/pairing_caption: t=0x12 d=0x00000000 (s=0x0008 r=0x00)在RRO期间,我可以看到:
resource 0x7f010000 com.foo.settings:id/pairing_caption: t=0x12 d=0x00000000 (s=0x0008 r=0x00)所以是的,身份证是不一样的。
现在,在对布局进行覆盖时,这应该是RRO的全部重点,这样才能与it匹配,从而保留原始it,但更改其周围的布局。但是怎么做呢?
我使用了一些aapt2 options --emit-ids和--stable-ids,试图强迫生成的id与Settings.apk中的id相等,但这同样失败了:
error: can't assign ID 0x7f0a0303 to resource com.foo.settings:id/pairing_caption with conflicting ID 0x7f010000.请注意,此问题是针对Android 10和更早版本的。在Android 11中,似乎有一种新的&更好的方法来定义目标包和覆盖包中的ids之间的映射。
我被困在这里了。如有任何建议,将不胜感激。
发布于 2022-05-07 22:08:20
关于链接罗罗
您可以找到以下内容
注意:如果覆盖布局文件,请确保所有If和应用程序命名空间属性都包含在overlays.xml和overlayable.xml中。例如:
<overlay>
<item target="layout/car_ui_base_layout_toolbar"
value="@layout/car_ui_base_layout_toolbar" />
<item target="id/car_ui_toolbar_background"
value="@id/car_ui_toolbar_background" />
<item target="attr/layout_constraintTop_toBottomOf"
value="@attr/layout_constraintTop_toBottomOf" />
</overlay>https://stackoverflow.com/questions/71517760
复制相似问题