Android EditText错误消息未显示在底部

时间:2016-01-20 18:21:54

标签: android error-handling android-edittext

我有一个用户输入客户信息的表单。当我尝试验证字段时遇到问题,我使用editText.setError(errorMessage)并显示错误消息,但它显示在我的EditText顶部,使其对用户造成混淆。如下图所示。

enter image description here

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

XML上的EditText

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

我的Validate课程如下:

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

4 个答案:

答案 0 :(得分:4)

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

app:layout_behavior="@string/appbar_scrolling_view_behavior"

一切都会好的!

答案 1 :(得分:2)

在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");

它会产生类似这样的输出...... enter image description here

答案 2 :(得分:0)

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

以下是活动的代码段: -

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

如果您仍然遇到问题,请发送活动代码,以便更好地了解我们并获得相应的答案。

答案 3 :(得分:0)

不要使用&#34; include&#34;标记以显示您的布局。只需用您的布局替换该标签即可。你想要设置marginTop =&#34; 60dp&#34;所以可以访问工具栏。