如何将自定义属性传递给嵌套 xml

How to pass custom attributes to nested xml

我有这样的结构:

preferences.xml:

...

<com.example.MyCustomPreference
    ...
    myCustomMessage="@string/abc"
    android:inputType="..."
    ... />

...

preference_my_custom.xml:

<LinearLayout ...>

    <com.example.MyCustomView
        ...
        app:myCustomMessage="?????"
        ... />

</LinearLayout>

view_my_custom.xml:

<GridView ...>
    ...EditTexts, TextViews, etc.
</GridView>

我想使用 XML 将 myCustomMessage 的值(为了简化我省略了其他属性)从 MyCustomPreference 传递到 MyCustomView。 MyCustomView 读取自定义属性,所以我想避免以编程方式读取 MyCustomPreference 中的属性,从 MyCustomView 获取 TextViews 并设置它们的值。但是,我真的不知道用什么来代替“??????”。

如何使用 XML 执行此操作?这可能吗?

您必须以编程方式执行此操作(除非您使用 data binding)。例如,在您的 MyCustomPreference 中,您捕获了属性 myCustomMessage:

String myCustomMessage = null;
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.MyCustomPreference, 0, 0);
try {
  myCustomMessage = a.getString(R.styleable.MyCustomPreference_myCustomMessage);
} finally {
  a.recycle();
}

此处您获得了属性的 String 值。那么,我猜你已经在你的 MyCustomPreference 里面给你的 MyCustomView 充气了。例如:

View.inflate(getContext(), R.layout.preference_my_custom, this);
MyCustomView myCustomView = (MyCustomView) findViewById(R.id.you_custom_view_id);

因此,您可以在此处以编程方式在 MyCustomView 中设置 myCustomMessage

myCustomView.setMyCustomMessage(myCustomMessage);

您应该创建此方法以正确设置文本,并在必要时将此文本传播到 MyCustomView 的其他子视图。

现在,更改 preferences.xml 中的 String resId,界面应该会按预期更新。

P.S: 由于我不知道你所有的资源id,请根据你的项目进行调整。

为您的 customeView 创建属性文件:

加入attrs.xml

<declare-styleable name="CustomView">
    <attr name="width" format="dimension" />
</declare-styleable>

在您的 customView 初始化中使用:

 public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomView, defStyle, 0);
    mWidth = a.getDimensionPixelSize(R.styleable.CustomView_width,0);
    a.recycle();
}