自定义小部件不重复儿童可绘制状态

时间:2014-05-29 13:26:34

标签: android android-widget

我有一个自定义小部件,它基本上是一个EditText,右边有一个小的“清除”按钮,可以清除编辑文本。 我将它构建为LinearLayout的子类,它在构造函数中添加了EditText和Button。 一切都按照它应该的方式工作,除了我希望整个LinearLayout在EditText具有焦点时具有焦点样式;我希望用户将其视为EditText,而不是具有EditText的容器。

我尝试使用addStatesFromChildren,但它似乎不起作用。附加代码。

ErasableField.java

public class ErasableField extends LinearLayout {

    private EditText editText;
    private View button;

    public ErasableField(Context context) {
        super(context);
        init(null);
    }

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

    public ErasableField(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs);
    }

    private void init(AttributeSet attrs) {
        this.setOrientation(HORIZONTAL);

        LayoutInflater inflater = LayoutInflater.from(getContext());
        editText = (EditText) inflater.
                inflate(R.layout.erasable_field_edittext, this, false);
        button = inflater.inflate(R.layout.erasable_field_button, this, false);

        if (attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ErasableField);

            boolean password = a.getBoolean(R.styleable.ErasableField_password, false);
            if (password) {
                editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            } else {
                editText.setInputType(InputType.TYPE_CLASS_TEXT);
            }
        }

        editText.setFocusable(true);
        editText.setClickable(true);
        editText.setFocusableInTouchMode(true);

        this.setClickable(false);
        this.setFocusable(false);
        this.setFocusableInTouchMode(false);
        this.setGravity(Gravity.CENTER_VERTICAL);
        this.setBackgroundResource(android.R.drawable.editbox_background);

        addView(editText);
        addView(button);

        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                editText.getText().clear();
            }
        });

        this.addStatesFromChildren();
    }

    public Editable getText() {
        return editText.getText();
    }

    public void setText(CharSequence text) {
        editText.setText(text);
    }

    public void setText(int resId) {
        editText.setText(resId);
    }

    public void setText(char[] text, int start, int len) {
        editText.setText(text, start, len);
    }    
}

erasable_field_edittext.xml

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layout_height="fill_parent"
    android:background="@color/white"
    android:singleLine="true"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:textCursorDrawable="@color/grey"
    >

</EditText>

erasable_field_button.xml

<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/Button.Delete"
    >

</ImageButton>

没关系丢失的样式,它只是一个带有小十字的红色按钮,它看起来像这样:

enter image description here

当用户点击edittext区域时,样式应更改为聚焦样式。

即。 (忽略不同的按钮外观):

enter image description here

我试图使用Android内置的样式:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:drawable="@drawable/editbox_background_focus_yellow" />
    <item android:drawable="@drawable/editbox_background_normal" />
</selector>

任何帮助?

1 个答案:

答案 0 :(得分:0)

通过更改

来解决问题
this.addStatesFromChildren();

this.setAddStatesFromChildren(true);

...