首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Android来覆盖布局?

如何使用Android来覆盖布局?
EN

Stack Overflow用户
提问于 2022-03-17 19:06:16
回答 1查看 819关注 0票数 1

我试图使用运行时资源覆盖( 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

代码语言:javascript
复制
<?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中膨胀此文件

代码语言:javascript
复制
        View view = getActivity().getLayoutInflater().inflate(R.layout.bluetooth_pin_confirm, null);

但是,它将无法通过id找到视图:

代码语言:javascript
复制
        TextView pairingViewCaption = (TextView) view.findViewById(R.id.pairing_caption);

找不到R.id.pairing_caption,因此pairingViewCaption将为空

因此,来自RRO的布局文件中的it似乎与原始it不同。

实际上,当在Settings应用程序apk上运行aap2转储时,我可以看到:

代码语言:javascript
复制
resource 0x7f0a02e0 com.android.settings:id/pairing_caption: t=0x12 d=0x00000000 (s=0x0008 r=0x00)

在RRO期间,我可以看到:

代码语言:javascript
复制
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相等,但这同样失败了:

代码语言:javascript
复制
error: can't assign ID 0x7f0a0303 to resource com.foo.settings:id/pairing_caption with conflicting ID 0x7f010000.

请注意,此问题是针对Android 10和更早版本的。在Android 11中,似乎有一种新的&更好的方法来定义目标包和覆盖包中的ids之间的映射。

我被困在这里了。如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2022-05-07 22:08:20

关于链接罗罗

您可以找到以下内容

注意:如果覆盖布局文件,请确保所有If和应用程序命名空间属性都包含在overlays.xml和overlayable.xml中。例如:

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71517760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档