1

AutoCompleteTextViewを含むTextInputLayoutを使用していますが、メソッドが呼び出されたときにその下線を赤くしたいです。TextInputLayout.setError()

state_errorval/attrs で呼び出される属性、メソッドを上書きするCustomTextInputLayoutsetError()、およびこの新しい状態をその状態に追加するCustomAutoCompleteTextViewを作成しました。

そして、セレクターを次のように定義しました。

<?xml version="1.0" encoding="utf-8"?>
<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/com.example.myapp">

    <item android:drawable="@drawable/bg_red_border" myapp:state_error="true" />
    <item android:drawable="@drawable/bg_gray_yellow_border" android:state_enabled="true" android:state_focused="true" />
    <item android:drawable="@drawable/bg_white_border" />

</selector>

つまり、 mycustomTextInputLayout.setError()が呼び出されると、そのCustomAutoCompleteTextViewsetErrorState(boolean)を呼び出します。これにより、この状態がtrueorに変更さfalseれ (受け取った値に応じて) 、 drawableのrefreshDrawableState()変更が呼び出されます。

ただし、下線は最初から赤で表示され、state_errorフィールドがfalse. どうして?他の州は機能していないようです。ビューがフォーカスを取得すると、線は黄色に変わりません。フォーカスを失うと、白ではなく赤に戻ります...

必要に応じて、以下のコードを参照してください。

activity_main.xml (関連する部分のみ)

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <com.example.myapp.CustomTextInputLayout
        android:id="@+id/et_nom"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="15dp"
        android:layout_weight="1">

        <com.example.myapp.CustomAutoCompleteTextView
            android:background="@drawable/my_selector"
            android:layout_width="match_parent"
            android:hint="@string/nom"
            android:maxLength="25"
            android:duplicateParentState="true"
            android:inputType="text"
            android:imeOptions="actionNext"
            android:nextFocusRight="@+id/et_primer_cognom" />

    </com.example.myapp.CustomTextInputLayout>
</LinearLayout>

値/attrs.xml

<resources>
    <declare-styleable name="custom_text_input_layout">
        <attr name="state_error" format="boolean" />
    </declare-styleable>
</resources>

CustomTextInputLayout.class

public class CustomTextInputLayout extends TextInputLayout{

    public CustomTextInputLayout(Context context) {
        super(context);
    }

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

    @Override
    public void setError(CharSequence error) {
        super.setError(error);
        if (getEditText() instanceof CustomAutoCompleteTextView) {
            ((CustomAutoCompleteTextView) getEditText()).setStateError(error != null);
        }
    }
}

CustomAutoCompleteTextView.class

public class CustomAutoCompleteTextView extends AutoCompleteTextView {

    private static final int[] STATE_ERROR = {R.attr.state_error};
    public boolean mStateError = false;


    public CustomAutoCompleteTextView(Context context) {
        super(context);
    }

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

    public CustomAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**Overrides the method to add the state_error attribute to the drawable state set only
     if its value is true.
     */
    @Override
    protected int[] onCreateDrawableState(int extraSpace) {

        final int[] drawableState;

        if (mStateError) {
            drawableState = super.onCreateDrawableState(extraSpace + 1);
            mergeDrawableStates(drawableState, STATE_ERROR);
        } else {
            drawableState = super.onCreateDrawableState(extraSpace);
        }

        return drawableState;
    }

    /**Changes the state_error of the view to toggle the red underline drawable on/off.*/
    public void setStateError(boolean stateError) {
        if (mStateError != stateError) {
            this.mStateError = stateError;
            refreshDrawableState();
        }
    }
}

アクティビティから呼び出すcustomTextInputLayout.setError()と、正常に動作し、エラーが完全に設定および設定解除されますがstateErrorCustomAutoCompleteTextViewのフィールドがfalse.

4

0 に答える 0