动态设置自定义ViewGroup的样式

时间:2018-12-13 17:06:01

标签: android viewgroup layoutparams

我创建了一个自定义的ViewGroup(DigitLayout.class),它以里程表的形式像显示一样显示给定的文本,如下面的洋红色所示:

enter image description here

自定义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,但这如何与子元素一起使用?

或者,如果我很喜欢,请告诉我。

我并不需要完整的解决方案,指向示例或文档适当部分的指针将是很好的选择。

谢谢。

0 个答案:

没有答案