【问题标题】:Android EditText error message not showing on bottomAndroid EditText 错误消息未显示在底部
【发布时间】:2016-01-20 18:21:54
【问题描述】:

我有一个表单,用户可以在其中输入客户信息。当我尝试验证遇到问题的字段时,我使用了editText.setError(errorMessage),它显示了错误消息,但它显示在我的 EditText 顶部,使用户感到困惑。如下图所示。

关于如何解决此问题的任何想法?

在 XML 上编辑文本

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
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="br.com.intelecto.intesigmobile.activity.ClienteEditActivityFragment">

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/et_nome"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/cliente_nome"
        android:imeActionId="@+id/cli_name"
        android:imeActionLabel="@string/str_next"
        android:imeOptions="actionUnspecified"
        android:inputType="textPersonName"
        android:maxLines="1"
        android:singleLine="true"/>
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/et_telefone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/cliente_telefone"
        android:imeActionId="@+id/cli_cpf"
        android:imeActionLabel="@string/str_next"
        android:imeOptions="actionUnspecified"
        android:inputType="phone"
        android:maxLines="1"
        android:singleLine="true"/>
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/et_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/cliente_email"
        android:imeActionId="@+id/cli_cpf"
        android:imeActionLabel="@string/str_next"
        android:imeOptions="actionUnspecified"
        android:inputType="textEmailAddress"
        android:maxLines="1"
        android:singleLine="true"/>
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/et_cpf"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/cliente_cpf"
        android:imeActionId="@+id/cli_cpf"
        android:imeActionLabel="@string/str_next"
        android:imeOptions="actionUnspecified"
        android:inputType="number"
        android:maxLines="1"
        android:singleLine="true"/>
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/et_endereco"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/cliente_endereco"
        android:imeActionId="@+id/cli_address"
        android:imeActionLabel="@string/str_next"
        android:imeOptions="actionUnspecified"
        android:inputType="textPostalAddress"
        android:maxLines="1"
        android:singleLine="true"/>
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/et_bairro"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/cliente_bairro"
        android:imeActionId="@+id/cli_district"
        android:imeActionLabel="@string/str_next"
        android:imeOptions="actionUnspecified"
        android:inputType="text"
        android:maxLines="1"
        android:singleLine="true"/>
</android.support.design.widget.TextInputLayout>

<Spinner
    android:id="@+id/sp_estados"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"/>

<Spinner
    android:id="@+id/sp_cidade"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    android:prompt="@string/cliente_cidade"/>

此 ClienteEditActivity 包含两个具有不同形式的片段,因此我在片段上侦听操作菜单单击,当单击菜单时,我使用它来调用可能验证:

if (!isValidEmail(etEmail)) {
     cancel = true;
     focusView = etEmail;
}
//after other validations
if (cancel){
   focusView.reqeustFocus();
} else {
   //save datas
}

isValidEmail 方法是这样的:

protected boolean isValidEmail(EditText editText) {

  validate = new Validate(editText);

  validate.addValidador(new ValidadorVazio(getContext()));
  validate.addValidador(new ValidadorEmail(getContext()));

  return validate.isValid();
}

我的Validateclass 看起来像这样:

public class Validate{
   private EditText etFonte;

   public Validate(EditText etFonte){
      this.etFonte = etFonte;
   }

   public void addValidador(AbstractValidador validador){
      lalidadores.add(validador);
   }

   public boolean isValid(){
      for (AbstractValidador validator : lValidadores) {
         try {
            if (!validator.isValid(etFonte.getText().toString())) {
               if(errorNotification != null) {
                  errorNotification.onInvalid(this);
               } else {
                  setSourceViewError(validator.getMessage(), validator.getErrorDrawable());
               }
               return false;
            } else {
               if(errorNotification != null) errorNotification.onValid(this);
            }
         } catch (ValidadorException e) {
            e.printStackTrace();
            if(errorNotification != null) {
               errorNotification.onInvalid(this);
            } else {
               setSourceViewError(e.getMessage(),validator.getErrorDrawable());
            }
            return false;
         }
      }
      etFonte.setError(null);
      return true;
   }

   private void setSourceViewError(String errorMessage, Drawable errorDrawable) {
      if(errorDrawable != null) {
         etFonte.setError(errorMessage, errorDrawable);
      } else {
        etFonte.setError(errorMessage);
      }
   }
}

【问题讨论】:

  • 不确定但你可以参考这个帖子stackoverflow.com/questions/10553920/…
  • 这是所有设备的行为吗?看来真的很可疑。为什么它指向顶部的editText?
  • 你能在一些模拟器和其他设备上试试吗?
  • @AnudeepBulla 我用我的手机(附上屏幕截图)和另外两个模拟器(800 x 1280:xhdpi,API:19 和 480 x 800:hdpi,API:22)进行了尝试并得到了相同的结果行为

标签: android error-handling android-edittext


【解决方案1】:

在 TextInputLayout 而不是 EditText 上设置错误,这是您的代码...

<android.support.design.widget.TextInputLayout
  android:id="@+id/textInputLayout"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

  <EditText
    android:id="@+id/et_nome"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/cliente_nome"
    android:imeActionId="@+id/cli_name"
    android:imeActionLabel="@string/str_next"
    android:imeOptions="actionUnspecified"
    android:inputType="textPersonName"
    android:maxLines="1"
    android:singleLine="true"/>

在运行时获取您的 TextInputLayout 并应用以下代码...

TextInputLayout textInputLayout = (TextInputLayout) findVeiwById(R.id.textInputLayout);
textInputLayout.setErrorEnabled(true);
textInputLayout.setError("Please enter a valid license number");

它会产生类似这样的输出...

【讨论】:

  • 我没试过,但我喜欢你的回答,下次会这样做。为你点赞@Khan
【解决方案2】:

在布局的根元素中,找到以下行并将其删除。

app:layout_behavior="@string/appbar_scrolling_view_behavior"

一切都会好起来的!

【讨论】:

  • 当我从布局中删除它时,我的工具栏变得不可见任何帮助
【解决方案3】:

我假设您在错误引用编辑文本时设置了错误。您必须在相同的编辑电子邮件编辑文本上设置错误,并且还必须请求关注相同的编辑文本。

这里是活动的代码sn-p:-

private EditText mEmailET;
@Override
protected void onCreate(Bundle savedInstanceState) {

mEamilET = (EditText)findViewById(R.id.et_email);
}

private void setSourceViewError(String errorMessage, Drawable errorDrawable) {
  if(errorDrawable != null) {
     mEamilET.setError(errorMessage, errorDrawable);
     mEamilET.requestFocus();
} else {
    mEamilET.setError(errorMessage);
    mEamilET.requestFocus();
 }
}

如果您仍然遇到问题,请将活动代码也发送给我们,以便我们更好地理解和适当的答案。

【讨论】:

    【解决方案4】:

    不要使用“包含”标签来显示您的布局。只需用您的布局替换该标签即可。您可能希望设置 marginTop="60dp" 以便工具栏可以访问。

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多