AutoCompleteTextViewを含むTextInputLayoutを使用していますが、メソッドが呼び出されたときにその下線を赤くしたいです。TextInputLayout.setError()
state_error
val/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)
を呼び出します。これにより、この状態がtrue
orに変更さ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()
と、正常に動作し、エラーが完全に設定および設定解除されますがstateError
、CustomAutoCompleteTextViewのフィールドがfalse
.