【发布时间】: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