【问题标题】:Design Android EditText to show error message as described by google设计 Android EditText 以显示谷歌描述的错误消息
【发布时间】:2015-09-06 08:09:58
【问题描述】:

我需要一个看起来像这样的EditText onError:

调用 onError 看起来像这样:

注意:该应用在 SDK 19 (4.4.2) 上运行

最小 SDK 为 1

有没有类似于 setError 的方法可以自动执行此操作, 还是我必须为它编写代码?

谢谢

【问题讨论】:

  • 您不太可能仅使用EditText 就可以做到这一点。更有可能的是,您需要包装 EditText 或以其他方式添加到它的东西。见github.com/rengwuxian/MaterialEditText

标签: android android-edittext


【解决方案1】:

由于 Google 引入了 TextInputLayout 作为 design-support-library 的一部分,因此无需使用第三方库。

以下基本示例:

布局

<android.support.design.widget.TextInputLayout
    android:id="@+id/text_input_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:errorEnabled="true">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter your name" />

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

注意:通过将app:errorEnabled="true" 设置为TextInputLayout 的属性,一旦显示错误,它就不会改变它的大小 - 所以它基本上会阻塞空间。

代码

为了在EditText 下方显示错误,您只需在TextInputLayout 上调用#setError(不在子EditText 上):

TextInputLayout til = (TextInputLayout) findViewById(R.id.text_input_layout);
til.setError("You need to enter a name");

结果

要隐藏错误并重置色调,只需调用til.setError(null)


注意

为了使用TextInputLayout,您必须将以下内容添加到您的build.gradle 依赖项中:

dependencies {
    compile 'com.android.support:design:25.1.0'
}

设置自定义颜色

默认情况下EditText 的行是红色的。如果您需要显示不同的颜色,您可以在调用setError 后立即使用以下代码。

editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP);

要清除它,只需调用clearColorFilter 函数,如下所示:

editText.getBackground().clearColorFilter();

【讨论】:

  • 是的!而已 !你怎么把这条线变成红色的?
  • @kmn 将线条变为红色并不是开箱即用的,因此您需要自己动手。请参阅我的编辑。在移动提示方面:那是不可能的。
  • @Alessio 我只是想说当你扩展 AppCompatActivity 时它应该可以工作。尽管如此:从 appcompat-v23 开始,不再需要设置 colorFilter,只要您调用 textInputLayout.setError("Error messsage")EditText 的颜色就会变为红色。为了重置它,调用textInputLayout.setError(null)就足够了。
  • editText.getBackground().setColorFilter(getResources().getColor(R.color.red_500_primary), PorterDuff.Mode.SRC_ATOP); 不再需要最新的支持库
  • 只是想说明一下,因为这是一个很小的细节——我是通过在EditText 上调用 setError 而不是TextInputLayout 遇到了这个问题。我看到了这个答案,但仍然无法弄清楚我需要改变什么。很容易错过。
【解决方案2】:

请致电 myTextInputLayout.setError() 而不是 myEditText.setError()

这些容器和容器在设置错误时具有双重功能。您需要的功能是容器的功能。但您可能需要 23 的最低版本。

【讨论】:

    【解决方案3】:

    您的EditText 应包含在TextInputLayout

    <android.support.design.widget.TextInputLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tilEmail">
    
        <EditText
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress"
            android:ems="10"
            android:id="@+id/etEmail"
            android:hint="Email"
            android:layout_marginTop="10dp"
            />
    
    </android.support.design.widget.TextInputLayout>
    

    要获得您想要的错误消息,请将错误设置为 TextInputLayout

    TextInputLayout tilEmail = (TextInputLayout) findViewById(R.id.tilEmail);
    if (error){
        tilEmail.setError("Invalid email id");    
    }
    

    您应该添加设计支持库依赖项。在你的 gradle 依赖项中添加这一行

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

    【讨论】:

      【解决方案4】:

      reVerse 的回答很棒,但没有指出如何删除浮动错误工具提示之类的东西

      您需要edittext.setError(null) 才能删除它。
      另外,正如有人指出的那样,您不需要TextInputLayout.setErrorEnabled(true)

      布局

      <android.support.design.widget.TextInputLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
      
          <EditText
              android:id="@+id/edittext"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:hint="Enter something" />
      </android.support.design.widget.TextInputLayout>
      

      代码

      TextInputLayout til = (TextInputLayout) editText.getParent();
      til.setError("Your input is not valid...");
      editText.setError(null);
      

      【讨论】:

        【解决方案5】:

        如果有人在使用答案中提到的谷歌设计库时仍然遇到错误,请按照@h_k 的评论使用它-

        您可能在 EditText 上使用 setError 而不是调用 setError on TextInputLayout

        【讨论】:

          【解决方案6】:
          TextInputLayout til = (TextInputLayout)editText.getParent();
          til.setErrorEnabled(true);
          til.setError("some error..");
          

          【讨论】:

          • 不需要setErrorEnabled
          【解决方案7】:
          private EditText edt_firstName;
          private String firstName;
          
          edt_firstName = findViewById(R.id.edt_firstName);
          
          private void validateData() {
           firstName = edt_firstName.getText().toString().trim();
           if (!firstName.isEmpty(){
          //here api call for ....
          }else{
          if (firstName.isEmpty()) {
                          edt_firstName.setError("Please Enter First Name");
                          edt_firstName.requestFocus();
                      } 
          }
          }
          

          【讨论】:

          • 在回答一个老问题时,如果您包含一些上下文来解释您的答案如何提供帮助,那么您的答案将对其他 StackOverflow 用户更有用,特别是对于已经有一个已接受答案的问题。请参阅:How do I write a good answer
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-11
          • 2019-03-12
          • 2016-06-19
          • 1970-01-01
          • 2015-03-25
          相关资源
          最近更新 更多