Передача атрибутов дочернему виду в сложных представлениях

Я пытаюсь создать сложное представление, в котором я могу установить атрибуты в XML и передать их дочерним элементам в составном представлении. В приведенном ниже коде я хочу установить android:text и передать его в EditText.

Возможно ли это, без необходимости устанавливать каждый атрибут в качестве настраиваемого атрибута?

Activity.xml:

<FrameLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>
        <com.app.CustomLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="child_view_text" />
</FrameLayout>

custom_view.xml:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.TextInputLayout
        android:id="@+id/textInputLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </android.support.design.widget.TextInputLayout>
</merge>

CustomView.java:

public ValidationTextInputLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
    View v = inflate(context, R.layout.custom_view, this);

    mEditText = (EditText) v.findViewById(R.id.editText);
    mTextInputLayout = (TextInputLayout) findViewById(R.id.textInputLayout);
}

Ответ 1

Я думаю, что, возможно, вы можете поместить в тему пользовательский текст (например, child_view_text), а затем использовать тему в родительском макете или представлении. При этом все дочерние представления будут иметь атрибут android: текст передается с пользовательским текстом.

В вашем случае это может выглядеть так:

<string name="child_view_text">Child View Text</string>

<style name="CustomTheme" parent="Theme.AppCompat">
    <item name="android:text">@string/child_view_text</item>
</style>

<FrameLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:theme="@style/CustomTheme"/>
     <com.app.CustomLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content" />
</FrameLayout>

Ответ 2

com.app.CustomLayout расширяет макет, то есть он не может принимать android: текст как атрибут. Вам нужно будет создать пользовательский атрибут для вашего класса CustomLayout и в указанном классе CustomLayout, раздуйте свой custom_view (как вы это делаете выше), проанализируйте attrs для своей пользовательской текстовой строки, затем вызовите mEditText.setText(customLayoutText).

Ответ 3

Вместо того, чтобы иметь EditText внутри CustomLayout.xml, вы можете создать экземпляр в CustomView.java, передав AttributeSet:

public class ValidationTextInputLayout extends LinearLayout
{
    public ValidationTextInputLayout(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs)
    {
        View v = inflate(context, R.layout.custom_view, this);

        mTextInputLayout = (TextInputLayout)findViewById(R.id.textInputLayout);

        mEditText = new EditText(context, attrs);
        mTextInputLayout.AddView(mEditText);
    }

    /* Properties etc... */
}

Для всех, у кого есть эта проблема.