我有一个用户输入客户信息的表单。当我尝试验证字段时遇到问题,我使用editText.setError(errorMessage)
并显示错误消息,但它显示在我的EditText顶部,使其对用户造成混淆。如下图所示。
关于如何解决这个问题的任何想法?
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 :(得分: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");
答案 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;所以可以访问工具栏。