如何将自定义属性传递给嵌套 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();
}
我有这样的结构:
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();
}