Передача атрибутов дочернему виду в сложных представлениях
Я пытаюсь создать сложное представление, в котором я могу установить атрибуты в 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... */
}
Для всех, у кого есть эта проблема.