setError
TextInputLayout
のときにisEmpty
が必要ですが、このコードを記述しますが、エラーメッセージが表示されたら、TextInputLayout
に赤い背景を設定してください!
私は背景を設定したくない! 欲しいエラーメッセージを表示するだけです。
私のコード:
if (TextUtils.isEmpty(userName)) {
register_UserName_layout.setError("Insert Username");
}
XMLコード:
<Android.support.design.widget.TextInputLayout
Android:id="@+id/register_userUsernameTextLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_below="@+id/register_headerLayout"
Android:layout_margin="10dp"
Android:textColorHint="#c5c5c5">
<EditText
Android:id="@+id/register_userUserNameText"
Android:layout_width="match_parent"
Android:layout_height="40dp"
Android:background="@drawable/selector_bg_edit"
Android:hint="نام کاربری"
Android:paddingBottom="2dp"
Android:textColor="@color/colorAccent"
Android:textCursorDrawable="@drawable/bg_input_cursor"
Android:textSize="16sp" />
</Android.support.design.widget.TextInputLayout>
どうすればこれを修正できますか?すべてに感謝<3
if (TextUtils.isEmpty(userName)) {
register_UserName_layout.setError("Insert Username");
txtInpit.setColorFilter(R.color.white);
}
この問題の回避策を見つけました。カスタムEditTextを作成し、そのgetBackground()メソッドをオーバーライドして、新しいドローアブルを返す必要があります。そうすれば、EditTextの背景ではなく、別のドローアブルを返すため、TextInputLayoutはEditTextの背景にカラーフィルターを設定できなくなります。下記参照:
@Override
public Drawable getBackground() {
return ContextCompat.getDrawable(getContext(), R.drawable.some_drawable);
}
textInputLayout内でカスタムEditTextを使用します。
<Android.support.design.widget.TextInputLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<CustomEditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/custom_edit_text_bg" />
</Android.support.design.widget.TextInputLayout>
私の場合、行を追加しました
<solid Android:color = "@ color/transparent" />
<shape Android:shape="rectangle"
xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<stroke Android:color="@color/lightGray" Android:width="1dp"/>
<solid Android:color="@color/transparent"/>
<padding Android:top="7dp" Android:bottom="7dp" Android:left="7dp" Android:right="7dp"/>
<corners Android:radius="2dp"/>
</shape>
これにより、背景全体ではなく、赤い境界線のみが表示されます
TextInputLayoutをサブクラス化して、次のように使用できます。
package com.mypackage;
import Android.content.Context;
import Android.graphics.drawable.Drawable;
import Android.support.annotation.Nullable;
import Android.support.design.widget.TextInputLayout;
import Android.util.AttributeSet;
public class CustomTextInputLayout extends TextInputLayout {
public CustomTextInputLayout(Context context) {
super(context);
}
public CustomTextInputLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
clearEditTextColorfilter();
}
@Override
public void setError(@Nullable CharSequence error) {
super.setError(error);
clearEditTextColorfilter();
}
private void clearEditTextColorfilter() {
EditText editText = getEditText();
if (editText != null) {
Drawable background = editText.getBackground();
if (background != null) {
background.clearColorFilter();
}
}
}
}
レイアウト内:
<com.mypackage.CustomTextInputLayout
Android:id="@+id/register_userUsernameTextLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_below="@+id/register_headerLayout"
Android:layout_margin="10dp"
Android:textColorHint="#c5c5c5">
<EditText
Android:id="@+id/register_userUserNameText"
Android:layout_width="match_parent"
Android:layout_height="40dp"
Android:background="@drawable/selector_bg_edit"
Android:hint="نام کاربری"
Android:paddingBottom="2dp"
Android:textColor="@color/colorAccent"
Android:textCursorDrawable="@drawable/bg_input_cursor"
Android:textSize="16sp" />
</Android.support.design.widget.TextInputLayout>
この問題の要点は、EditTextに背景色が設定されているかどうかを確認することです。その場合は、それを削除し、代わりにテキストの入力レイアウトウィジェットに背景色を配置します。これにより、大きな赤いボックスの問題が修正されます。少なくとも私にとってはそうだった。
EditTextをサブクラス化し、次のメソッドを適用します。
GetBackgroundをオーバーライドし、入力背景を持つDrawableを作成します
@Override
public Drawable getBackground() {
return ContextCompat.getDrawable(getContext(), R.drawable.input_background);
}
drawableinput_brackgroundは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<solid
Android:color="@color/inputBackgroundColor">
</solid>
</shape>
そして、次のようなTextInputLayoutセットエラーの後にEditTextサブクラス化されたsetBackgroundを適用します。
private void showTheError(String error){
textInputLayout.setError(error);
editTextSubclassed.setBackgroundColor(getResources().getColor(R.color.inputBackgroundColor));
}
まず、EditTextの背景selector_bg_editは次のようになります
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:drawable="@drawable/code_view_item"
Android:state_focused="true"/>
<item Android:drawable="@drawable/sign_in_fields"
Android:state_focused="false"/>
<item Android:drawable="@drawable/sign_in_fields"
Android:state_active="false"/>
</selector>
そして最も重要なことは、このcode_view_item.xmlのように透明な色になるようにドローアブルを配置することです
<stroke Android:width="1dp" Android:color="#15A859" />
<solid Android:color="#00FFFFFF" />
<corners Android:radius="12dp"/>
Shahin Mursalovの回答と同様に、コストラクタでメソッドinit()
を呼び出して、ビューの作成時に描画可能な背景を保存します。また、メソッドsetBackgroundResource()
をオーバーライドして背景も保存し、getBackground()
から返します。
public class CustomEditText extends EditText{
private Drawable backgroundDrawable;
public EditTextContext context) {
super(context);
this.context = context;
}
public EditTextContext context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
init(attrs);
}
public EditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
init(attrs);
}
public void init(AttributeSet attrs){
TypedArray attributes = context.obtainStyledAttributes(attrs, new int[]{Android.R.attr.background});
this.backgroundDrawable = attributes.getDrawable(0);
attributes.recycle();
}
@Override
public void setBackgroundResource(@DrawableRes int resId) {
this.backgroundDrawable = ContextCompat.getDrawable(context, resId);
super.setBackgroundResource(resId);
}
@Override
public Drawable getBackground() {
if (backgroundDrawable != null){
return backgroundDrawable;
} else {
return super.getBackground();
}
}
}
このようにして、レイアウトで別の背景を指定し、プログラムで変更することができます。