我创建了一个自定义的ViewGroup(DigitLayout.class),它以里程表的形式像显示一样显示给定的文本,如下面的洋红色所示:
自定义ViewGroup的基本原理是,在调用var locations = [
[{{ i.restaurant }}, {{ i.latitude }}, {{ i.longitude }}, {{ i.id }}]
];
方法时,会为每个字符动态创建一个带有子TextView的RelativeLayout,并将其添加到自定义ViewGroup中。
但是,子级RelativeLayouts和TextViews的样式当前在自定义ViewGroup的setText(CharSequence text)
方法中进行了硬编码:
setText(CharSequence text)
我想做的就是推断样式,以便我可以对上面用蓝色突出显示的值重复使用相同的自定义ViewGroup类,但是此值的样式有所不同,但前提是每个字符都包含在自己的字符中父级RelativeLayout中的TextView。
所以我需要一个指针的地方是如何设置自定义ViewGroup的RelativeLayout和TextView子元素的样式。
目前,无论何时我需要新的DigitLayout,我都会在适当的布局xml中添加以下内容:
public class DigitLayout extends LinearLayout {
// Constant for logging
private static final String TAG = DigitLayout.class.getSimpleName();
public DigitLayout(Context context) {
super(context);
}
public DigitLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public DigitLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public DigitLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setText(CharSequence text) {
// Clear existing value
clearText();
// Get the number of digits to display
int numberOfDigits = text.length();
for ( int i = 0; i < numberOfDigits; i++ ) {
RelativeLayout digitContainer = new RelativeLayout(getContext()); // Container for the TextView
LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(50,
ViewGroup.LayoutParams.WRAP_CONTENT);
linearParams.setMargins(5,0,5,0);
digitContainer.setLayoutParams(linearParams);
digitContainer.setBackground(getContext().getDrawable(R.drawable.bg));
// Create a TextView for the digit
TextView digitTextView;
digitTextView = new TextView(getContext());
digitTextView.setLayoutParams(new TableLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1f
));
digitTextView.setGravity(Gravity.CENTER);
digitTextView.setTextSize(16f);
digitTextView.setTextColor(Color.WHITE);
digitTextView.setTypeface(Typeface.DEFAULT_BOLD);
digitTextView.setText(text.subSequence(i, i+1));
digitContainer.addView(digitTextView, 0);
this.addView(digitContainer);
}
}
private void clearText() {
this.removeAllViews();
}
}
我不认为我应该在上面的xml布局中添加RelativeLayout和TextView,因为它们需要动态添加(因为它们的数量取决于字符数)。
因此,对于我需要的每个样式选项,我是否应该创建一个单独的布局xml文件,以RelativeLayout作为根目录,并使用一个子TextView,如果是这样,我的DigitLayout.class如何知道每个样式使用的样式化xml?实例?
可能使用LayoutInflater,但这如何与子元素一起使用?
或者,如果我很喜欢,请告诉我。
我并不需要完整的解决方案,指向示例或文档适当部分的指针将是很好的选择。
谢谢。