Android 中 isEmpty 时如何修复背景红色 TextInputLayout
How to fix background red color TextInputLayout when isEmpty in Android
我想要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() 方法覆盖为 return 一个新的可绘制对象。这样 TextInputLayout 将无法在 EditText 的背景上设置颜色过滤器,因为您没有 return 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>
与 Shahin Mursalov 的回答类似,我在构造函数中调用方法 init()
以在创建视图时存储可绘制的背景。此外,我还覆盖了方法 setBackgroundResource()
来存储背景,并且 return 它来自 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();
}
}
}
这样我就可以在我的布局中指定不同的背景并以编程方式更改它。
您可以继承 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 并应用以下方法:
覆盖 getBackground 并创建具有输入背景的 Drawable
@Override
public Drawable getBackground() {
return ContextCompat.getDrawable(getContext(), R.drawable.input_background);
}
你的 Drawable input_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));
}
在我的例子中,我添加了行
<固体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>
这只会导致红色边框而不是整个背景
此问题的底线是检查您的 EditText 是否设置了背景色。如果是这样,请将其删除并在您的文本输入布局小部件上放置背景颜色。这将解决大红色框的问题。至少它对我有用。
首先你的 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>
而且最重要的是把drawable放到透明色这样
code_view_item.xml
<stroke android:width="1dp" android:color="#15A859" />
<solid android:color="#00FFFFFF" />
<corners android:radius="12dp"/>
对我有用的是把它放在我的自定义编辑文本的下面 class :
override fun getBackground(): Drawable {
return this.context.getDrawable(R.drawable.myDrawableResource)
}
我的解决方案:
yourEdit.background.clearColorFilter()
我想要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() 方法覆盖为 return 一个新的可绘制对象。这样 TextInputLayout 将无法在 EditText 的背景上设置颜色过滤器,因为您没有 return 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>
与 Shahin Mursalov 的回答类似,我在构造函数中调用方法 init()
以在创建视图时存储可绘制的背景。此外,我还覆盖了方法 setBackgroundResource()
来存储背景,并且 return 它来自 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();
}
}
}
这样我就可以在我的布局中指定不同的背景并以编程方式更改它。
您可以继承 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 并应用以下方法:
覆盖 getBackground 并创建具有输入背景的 Drawable
@Override
public Drawable getBackground() {
return ContextCompat.getDrawable(getContext(), R.drawable.input_background);
}
你的 Drawable input_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));
}
在我的例子中,我添加了行
<固体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>
这只会导致红色边框而不是整个背景
此问题的底线是检查您的 EditText 是否设置了背景色。如果是这样,请将其删除并在您的文本输入布局小部件上放置背景颜色。这将解决大红色框的问题。至少它对我有用。
首先你的 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>
而且最重要的是把drawable放到透明色这样 code_view_item.xml
<stroke android:width="1dp" android:color="#15A859" />
<solid android:color="#00FFFFFF" />
<corners android:radius="12dp"/>
对我有用的是把它放在我的自定义编辑文本的下面 class :
override fun getBackground(): Drawable {
return this.context.getDrawable(R.drawable.myDrawableResource)
}
我的解决方案:
yourEdit.background.clearColorFilter()