web-dev-qa-db-ja.com

AndroidでisEmptyの場合、背景の赤色のTextInputLayoutを修正する方法

setErrorTextInputLayoutのときにisEmptyが必要ですが、このコードを記述しますが、エラーメッセージが表示されたら、TextInputLayoutに赤い背景を設定してください!

私は背景を設定したくない欲しいエラーメッセージを表示するだけです。

enter image description here

私のコード:

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

11
user6761472
if (TextUtils.isEmpty(userName)) {
    register_UserName_layout.setError("Insert Username");
    txtInpit.setColorFilter(R.color.white);
}
0
Yogesh Rathi

この問題の回避策を見つけました。カスタム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>
12
user7010102

私の場合、行を追加しました

<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>

これにより、背景全体ではなく、赤い境界線のみが表示されます

5
rivasyshyn

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>
4
Hans

この問題の要点は、EditTextに背景色が設定されているかどうかを確認することです。その場合は、それを削除し、代わりにテキストの入力レイアウトウィジェットに背景色を配置します。これにより、大きな赤いボックスの問題が修正されます。少なくとも私にとってはそうだった。

4

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));
}
1
Maycon Teixeira

まず、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"/>
0
Peter Fam

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();
        }
    }
}

このようにして、レイアウトで別の背景を指定し、プログラムで変更することができます。