Динамически разрабатывать пользовательские ViewGroup - PullRequest
0 голосов
/ 13 декабря 2018

Я создал пользовательскую группу ViewGroup (DigitLayout.class), которая отображает данный текст в виде одометра, как показано на рисунке ниже:

enter image description here

Основной принцип пользовательской ViewGroup заключается в том, что когда метод setText(CharSequence text) вызывается, RelativeLayout с дочерним TextView создается динамически для каждого символа и добавляется в пользовательскую ViewGroup.

Однако стилизациядочерние RelativeLayouts и TextViews в настоящее время жестко запрограммированы в методе setText(CharSequence text) пользовательской ViewGroup:

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

Что я хотел бы сделать, это экстраполировать стиль, чтобы я мог повторно использовать тот же пользовательский класс ViewGroup для выделенного значениясиним цветом выше, но это значение стилизовано по-разному, но с той же предпосылкой, что каждый символ содержится в его собственном TextView в родительском RelativeLayout.

Так что мне нужен указатель, как стилизовать дочерние элементы RelativeLayout и TextViewэлементы пользовательской ViewGroup.

В настоящее время, где бы мне ни понадобился новый DigitLayout, я добавляю следующее в соответствующий XML-макет:

<org.barsys.android.widget.DigitLayout
    android:id="@+id/dd_fuel_entry_trip_meter_reading"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_marginTop="5dp"
    android:gravity="center"
    android:orientation="horizontal"></org.barsys.android.widget.DigitLayout>

Я не думаю, что мне следует добавлять RelativeLayout и TextView в макет XML выше, так как они должны бытьдобавляется динамически (так как количество каждого зависит от количества символов).

Итак, я должен создать отдельный XML-файл макета с RelativeLayout в качестве корневого и дочерним TextView для каждого требуемого параметра стиляи если да, то как мой DigitLayout.class узнает, какой стиль XML-макета использовать для каждого экземпляра?

Возможно, использовать LayoutInflater, но как это работает с дочерними элементами?

В качестве альтернативы, если я нахожусь на отметке, дайте мне знать.

Яне требуя полного решения, ссылки на примеры или соответствующие разделы документации были бы хорошими.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...