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

时间:2018-05-29 11:45:28

标签: android android-custom-view attr

我有这样的结构:

的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执行此操作?这可能吗?

2 个答案:

答案 0 :(得分:2)

您必须以编程方式执行此操作(除非您使用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值。然后,我想你已经在你的MyCustomView内夸大了MyCustomPreference。举个例子:

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

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

myCustomView.setMyCustomMessage(myCustomMessage);

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

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

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

答案 1 :(得分:0)

为您的customeView创建一个属性文件:

添加attrs.xml

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

在customView init中使用:

 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();
}