2016-01-20 64 views
0

我有一個表單,用戶輸入客戶端信息。當我嘗試驗證字段有問題時,我使用了editText.setError(errorMessage),它顯示了錯誤消息,但它顯示在我的EditText的頂部,使用戶感到困惑。像下面的圖片一樣。Android 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); 
     } 
    } 
} 
+0

不知道,但你可以參考這個線程http://stackoverflow.com/questions/10553920/small-edittext-have-a-seterror-with-a-lot-of-lines – Nik

+0

這是所有設備的行爲?似乎真的懷疑。它爲什麼指向頂部的editText? –

+0

你可以嘗試一些模擬器和其他設備嗎? –

回答

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

它將產生這樣的輸出... enter image description here

+1

我沒有嘗試過,但我喜歡你的答案下次會做。豎起大拇指投票給你@Khan –

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

如果您仍然面臨着問題,請發送活動代碼也爲我們更好地理解和恰當的答案。

+0

我更新了代碼 –

0

不要使用「包含」標籤來顯示您的佈局。只需用您的佈局替換該標籤,您就可以走了。你會想設置marginTop =「60dp」,這樣工具欄就可以訪問。

4

在您的佈局的根元素中,找到以下行並將其刪除。

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

一切都會好的!

+0

這樣做的技巧 –

+0

當我從佈局中刪除這個時,我的工具欄變得不可見任何幫助 –

+0

添加相對佈局解決了我的問題 –