EditText setError不显示默认错误图标

时间:2016-11-05 05:59:01

标签: java android

我在Android应用中对EditText进行了验证。错误消息按预期弹出,但不显示默认错误图标。

enter image description here

    if(users.getText().toString().isEmpty()){
        errorNum++;
        users.setError("Field can not be empty");
    } else {
        users.setError(null);
    }

我也尝试使用自定义图标,它也不起作用。

users.setError("Field can not be empty",getDrawable(R.drawable.ic_error_outline_black_24dp));

如何获取验证的默认错误图标

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.dinesh.note.MainActivity">

<TableLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"> 

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/textView7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:labelFor="@+id/users"
            android:text="@string/users"
android:textAppearance="@android:style/TextAppearance.Widget.TextView" />

        <EditText
            android:id="@+id/users"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="number"
             />
    </TableRow>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:labelFor="@+id/years"
            android:text="@string/years"


android:textAppearance="@android:style/TextAppearance.Widget.TextView" />

        <EditText
            android:id="@+id/years"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"


            android:ems="10"
            android:inputType="number" />
    </TableRow>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/textView5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:labelFor="@+id/percentage"
            android:text="@string/percentage"
            android:textAppearance="@android:style/TextAppearance.Widget.TextView" />

        <EditText
            android:id="@+id/percentage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:ems="10"
            android:inputType="numberDecimal" />
    </TableRow>

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/textView6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:labelFor="@+id/months"
            android:text="@string/months"
            android:textAppearance="@android:style/TextAppearance.Widget.TextView" />

        <EditText
            android:id="@+id/months"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            android:ems="10"
            android:inputType="number" />
    </TableRow>
</TableLayout>

<TextView
    android:id="@+id/tamount"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/calculate"
    android:layout_marginTop="24dp"
    android:text="@string/tamount"
    android:textAppearance="@style/TextAppearance.AppCompat.Title" />

<TextView
    android:id="@+id/amount"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_below="@+id/tamount"
    android:layout_marginTop="24dp"
    android:text="@string/amount"
    android:textAlignment="center"
    android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large"
    android:textSize="36sp"
    android:textColor="@color/colorAccent" />

<Button
    android:id="@+id/calculate"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    android:text="@string/calculate"
    android:textColor="@android:color/background_light"
    android:layout_marginTop="227dp"
    android:onClick="calculateBtn"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true" />
</RelativeLayout>

样式xml

<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

</resources>

2 个答案:

答案 0 :(得分:1)

有两种方式 -

方法1

您可以通过覆盖setError()方法创建自己的setCompoundDrawables()类,并使用public class CustomErrorEditText extends EditText { public CustomErrorEditText(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setError(CharSequence error, Drawable icon) { setCompoundDrawables(null, null, icon, null); } } 方法显示错误图标。

setError

方法2

Drawable drawable = getDrawable(R.drawable.ic_error_outline_black_24dp); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); users.setError("error", drawable); 中使用之前,您需要在drawable上设置边界。

.yourElement{
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

答案 1 :(得分:1)

我认真建议您考虑采用这种方式的现代方法,原因之一是:随着更多用户升级其设备,Google提供的向后兼容库已经可以实现此目的。

例如,尝试:TextInputLayout可以通过支持库获得。如果您尚未添加,请在app-level build.gradle文件中执行此操作。

compile 'com.android.support:design:25.0.0'

然后在你的布局文件中:

<android.support.design.widget.TextInputLayout
    android:id="@+id/quoteIdWrapper"
    android:layout_gravity="start"
    android:layout_width="match_parent"
    android:gravity="start"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/quoteId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:lines="8"
        android:layout_gravity="start"
        android:gravity="top|start"
        android:minLines="5"
        android:maxLines="10"
        android:scrollbars="vertical"
        android:inputType="textCapSentences|textMultiLine"
        android:hint="@string/quote_text"/>

</android.support.design.widget.TextInputLayout>

然后,您可以从代码中获取对这两个项目的引用(TextInputLayout & EditText)。

接下来,验证Edittext字段,如果某些内容无效,请将以下属性设置为TextInputLayout引用:

textInputLayout.setErrorEnabled(true);
textInputLayout.setError("Your error message");

这将自动用正确的颜色(经常是红色)发送给用户,以便更容易地知道某些东西是错过的。

我希望你明白我的想法。祝你好运!!