将属性传递给复合视图中的子视图

时间:2016-01-31 05:41:37

标签: android android-support-library android-custom-view

我正在尝试创建一个复合视图,我可以在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);
}

3 个答案:

答案 0 :(得分:2)

您可以在CustomView.java中通过AttributeSet实例化它而不是在CustomLayout.xml中使用EditText:

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... */
}

对于仍有此问题的人。

答案 1 :(得分:0)

我想可能你可以将自定义文本(即child_view_text)放在主题中,然后在父布局或视图上使用主题。这样,所有子视图都将使用自定义文本传入属性android:text。

在您的情况下,它可能看起来像:

<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 :(得分:0)

com.app.CustomLayout 扩展了一个布局,这意味着它无法将android:text作为属性。您需要为CustomLayout类创建自定义属性,并在所述CustomLayout类中,为您的custom_view充气(正如您上面所做的那样),解析您的自定义文本字符串的attrs,然后调用mEditText.setText( customLayoutText)。