将自定义视图xml文件中的attriburte传播给子项

时间:2016-11-20 06:38:55

标签: android android-custom-view

我有一个自定义视图,其布局包含EditText。 我希望在xml布局文件中添加android:imeOptions或其他,并让它传播给孩子EditText

有没有办法做到这一点,没有自定义属性(为了保持一致性)?

感谢。

1 个答案:

答案 0 :(得分:1)

这可以通过在自定义ViewGroup的构造函数中检索属性值,并通过覆盖在适当的子View上设置它来实现ViewGroup' addView(View, int, LayoutParams)方法。

AttributeSet获取该值有几种不同的方法。以下是使用imeOptions属性的示例。

可能是最标准的&#34;方法是在CustomViewGroup <declare-styleable>中包含平台属性,并像检查自定义属性一样检索其值。

res/values/

<resources>
    <declare-styleable name="CustomViewGroup">
        <attr name="android:imeOptions" />
        ...
    </declare-styleable>
</resources>

在Java代码中:

public class CustomViewGroup extends ViewGroup {
    private static final int IME_OPTIONS_NONE = -1;

    private int mImeOptions;

    public CustomViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomViewGroup);
        mImeOptions = a.getInt(R.styleable.CustomViewGroup_android_imeOptions, IME_OPTIONS_NONE);
        ...
        a.recycle();
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        super.addView(child, index, params);

        if (child instanceof EditText && mImeOptions != IME_OPTIONS_NONE) {
            ((EditText) child).setImeOptions(mImeOptions);
        }
    }
}

或者,自己定义属性数组,而不是通过资源定义,并以类似方式检索值。

public class CustomViewGroup extends ViewGroup {
    private static final int[] ANDROID_ATTRS = { android.R.attr.imeOptions };
    private static final int IME_OPTIONS_NONE = -1;

    private int mImeOptions;

    public CustomViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray a = context.obtainStyledAttributes(attrs, ANDROID_ATTRS);

        // 0 is passed as the first argument here because
        // android.R.attr.imeOptions is the 0th element in
        // the ANDROID_ATTRS array.
        mImeOptions = a.getInt(0, IME_OPTIONS_NONE);

        a.recycle();
    }

    // Same addView() method
}

或者,使用适当的AttributeSet方法直接从getAttribute*Value()获取原始值。

public class CustomViewGroup extends ViewGroup {
    private static final String NAMESPACE = "http://schemas.android.com/apk/res/android";
    private static final String ATTR_IME_OPTIONS = "imeOptions";
    private static final int IME_OPTIONS_NONE = -1;

    private int mImeOptions;

    public CustomViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);

        mImeOptions = attrs.getAttributeIntValue(NAMESPACE, ATTR_IME_OPTIONS, IME_OPTIONS_NONE);
    }

    // Same addView() method
}

如果要传播给子View的属性是您的自定义ViewGroup超级类已经使用的属性,那么您不一定需要从AttributeSet读取。在调用super构造函数之后,您可以使用适当的getter方法来检索其值,它将在此处理并应用。