我有这样的结构:
的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执行此操作?这可能吗?
答案 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();
}