为什么EditText验证时会出现两个错误标志?(Why two error signs is visible when EditText validate?)

编程入门 行业动态 更新时间:2024-10-28 10:28:47
为什么EditText验证时会出现两个错误标志?(Why two error signs is visible when EditText validate?)

为了验证,我使用了saripaar验证库。 当表单无效时,它会给出带有消息的红色错误标志,但是当我单击错误字段时,另一个红色错误标志也会出现,这个额外的红色标志是意外的。 如何删除这个额外的错误标志?

截图:

源代码 :

package com.brainstation.ib.abbl.ui.activities; import android.app.Dialog; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; import android.support.v7.widget.AppCompatEditText; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.SpannableString; import android.text.style.StyleSpan; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.basgeekball.awesomevalidation.AwesomeValidation; import com.basgeekball.awesomevalidation.ValidationStyle; import com.brainstation.ib.abbl.R; import com.brainstation.ib.abbl.common.activities.TopMenuActivity; import com.brainstation.ib.abbl.common.constant.MessageText; import com.brainstation.ib.abbl.common.constant.PreferencesKey; import com.brainstation.ib.abbl.common.enums.ResponseCode; import com.brainstation.ib.abbl.common.model.BaseResponse; import com.brainstation.ib.abbl.common.util.CustomLoadingDialog; import com.brainstation.ib.abbl.model.activitylog.loglist.ActivityLogModel; import com.brainstation.ib.abbl.model.authentication.ChangeLogInMessageModel; import com.brainstation.ib.abbl.model.authentication.LoginPasswordChangeRequest; import com.brainstation.ib.abbl.network.provider.ApiProvider; import com.brainstation.ib.abbl.ui.adapter.NotificationListAdapter; import com.mobsandgeeks.saripaar.ValidationError; import com.mobsandgeeks.saripaar.Validator; import com.mobsandgeeks.saripaar.annotation.ConfirmPassword; import com.mobsandgeeks.saripaar.annotation.NotEmpty; import com.mobsandgeeks.saripaar.annotation.Password; import com.pixplicity.easyprefs.library.Prefs; import com.weiwangcn.betterspinner.library.BetterSpinner; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class ChangeLoginPasswordActivity extends TopMenuActivity { //AwesomeValidation awesomeValidation = new AwesomeValidation(ValidationStyle.BASIC); @BindView(R.id.etCurrentPassword) @NotEmpty TextInputEditText etCurrentPassword; @BindView(R.id.txtChangeLogInMessage) TextView txtChangeLogInMessage; @BindView(R.id.txtChangePassTitle) TextView txtChangePassTitle; @BindView(R.id.rootLinearLayout) LinearLayout rootLinearLayout; @BindView(R.id.textInputLayout1) TextInputLayout textInputLayout1; @BindView(R.id.textInputLayout2) TextInputLayout textInputLayout2; @BindView(R.id.textInputLayout3) TextInputLayout textInputLayout3; @BindView(R.id.etNewPassword) @Password TextInputEditText etNewPassword; @BindView(R.id.etConfirmPassword) @ConfirmPassword TextInputEditText etConfirmPassword; @BindView(R.id.top_menu) LinearLayout topMenu; private CustomLoadingDialog dialog; private Validator validator; private String authToken; String message; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_change_login_password); //awesomeValidation.addValidation(ChangeLoginPasswordActivity.this, R.id.etCurrentPassword, "[a-zA-Z0-9_-]+", R.string.emptyError); ButterKnife.bind(this); setTopMenu(); if (getIntent().getStringExtra("force") != null) topMenu.setVisibility(View.GONE); else { topMenu.setVisibility(View.VISIBLE); } dialog = new CustomLoadingDialog(this); authToken = Prefs.getString(PreferencesKey.AUTH_TOKEN, null); callMessageApi(); validator = new Validator(this); validator.setValidationListener(new Validator.ValidationListener() { @Override public void onValidationSucceeded() { callApi(); } @Override public void onValidationFailed(List<ValidationError> errors) { for (ValidationError error : errors) { View view = error.getView(); String message = error.getCollatedErrorMessage(ChangeLoginPasswordActivity.this); if (view instanceof AppCompatEditText) { ((AppCompatEditText) view).setError(message); } if (view instanceof TextInputEditText) { ((TextInputEditText) view).setError(message); } else if (view instanceof BetterSpinner) { ((BetterSpinner) view).setError(message); } else { Snackbar.make(rootLinearLayout, message, Snackbar.LENGTH_LONG).show(); } } } }); } private void callApi() { dialog.show(); LoginPasswordChangeRequest request = new LoginPasswordChangeRequest(); request.setOldPassword(etCurrentPassword.getText().toString()); request.setNewPassword(etNewPassword.getText().toString()); request.setUserName(Prefs.getString(PreferencesKey.USER_ID, "")); request.setIpAddress(""); Call<BaseResponse> call = ApiProvider.getApiClient().changeLoginPassword(authToken, request); call.enqueue(new Callback<BaseResponse>() { @Override public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) { if (response.isSuccessful()) { if (response.body().getResponseCode() == ResponseCode.OPERATION_SUCCESSFUL.getCode()) { Snackbar.make(rootLinearLayout, "Password changed successfully", Snackbar.LENGTH_INDEFINITE) .setAction("Done", new View.OnClickListener() { @Override public void onClick(View view) { Prefs.clear(); Intent intent = new Intent(getApplicationContext(), LogInActivity.class); startActivity(intent); } }).show(); } else if (response.body().getResponseCode() == ResponseCode.AUTHENTICATION_FAILED.getCode()) { if (getIntent().getStringExtra("force") != null) { Toast.makeText(getApplicationContext(), "Mismatch Information.", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), MessageText.TOKEN_EXPIRED_MSG, Toast.LENGTH_LONG).show(); gotoLogin(); finish(); } } else if (response.body().getResponseCode() == ResponseCode.INVALID_ARGUMENT.getCode()) { Snackbar.make(rootLinearLayout, response.body().getErrors().get(0), Snackbar.LENGTH_LONG).show(); } else { Snackbar.make(rootLinearLayout, MessageText.ERROR_MSG, Snackbar.LENGTH_LONG).show(); } } else { Snackbar.make(rootLinearLayout, MessageText.ERROR_MSG, Snackbar.LENGTH_LONG).show(); } dialog.cancel(); } @Override public void onFailure(Call<BaseResponse> call, Throwable t) { dialog.cancel(); Snackbar.make(rootLinearLayout, MessageText.ERROR_MSG, Snackbar.LENGTH_LONG).show(); } }); } @OnClick(R.id.backBtn) public void back(View view) { checkAuthAndGotoActivity(ChangeLoginPasswordActivity.this, ServicesActivity.class); } @OnClick(R.id.submitButton) public void submit(View view) { validator.validate(); } public void callMessageApi() { dialog.show(); ApiProvider.getApiClient().getMessageChangeLogin(authToken).enqueue(new Callback<ChangeLogInMessageModel>() { @Override public void onResponse(Call<ChangeLogInMessageModel> call, Response<ChangeLogInMessageModel> response) { if (response.isSuccessful()) { message = response.body().getItems(); showMessage(); dialog.cancel(); } else { dialog.cancel(); Snackbar.make(rootLinearLayout, response.body().getErrors().get(0).toString(), Snackbar.LENGTH_LONG).show(); } } @Override public void onFailure(Call<ChangeLogInMessageModel> call, Throwable t) { Snackbar.make(rootLinearLayout, MessageText.ERROR_MSG, Snackbar.LENGTH_LONG).show(); } }); } public void showMessage() { if (message == null) { } else { String steps = "Note: " + message; String title = "Change Password"; SpannableString ss1 = new SpannableString(title); ss1.setSpan(new StyleSpan(Typeface.BOLD), 0, ss1.length(), 0); txtChangePassTitle.append(ss1); txtChangePassTitle.append("\n"); txtChangePassTitle.append(steps); } } @Override public void onBackPressed() { checkAuthAndGotoActivity(ChangeLoginPasswordActivity.this, ServicesActivity.class); overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left); } }

For validation I have used saripaar validation library. When form is not valid it gives a red error sign with a message but when I click on error field another red error sign also appeared this extra red sign is unexpected. How can I remove this extra error sign?

Screenshot :

Source code :

package com.brainstation.ib.abbl.ui.activities; import android.app.Dialog; import android.content.Intent; import android.graphics.Typeface; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.design.widget.TextInputEditText; import android.support.design.widget.TextInputLayout; import android.support.v7.widget.AppCompatEditText; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.SpannableString; import android.text.style.StyleSpan; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.basgeekball.awesomevalidation.AwesomeValidation; import com.basgeekball.awesomevalidation.ValidationStyle; import com.brainstation.ib.abbl.R; import com.brainstation.ib.abbl.common.activities.TopMenuActivity; import com.brainstation.ib.abbl.common.constant.MessageText; import com.brainstation.ib.abbl.common.constant.PreferencesKey; import com.brainstation.ib.abbl.common.enums.ResponseCode; import com.brainstation.ib.abbl.common.model.BaseResponse; import com.brainstation.ib.abbl.common.util.CustomLoadingDialog; import com.brainstation.ib.abbl.model.activitylog.loglist.ActivityLogModel; import com.brainstation.ib.abbl.model.authentication.ChangeLogInMessageModel; import com.brainstation.ib.abbl.model.authentication.LoginPasswordChangeRequest; import com.brainstation.ib.abbl.network.provider.ApiProvider; import com.brainstation.ib.abbl.ui.adapter.NotificationListAdapter; import com.mobsandgeeks.saripaar.ValidationError; import com.mobsandgeeks.saripaar.Validator; import com.mobsandgeeks.saripaar.annotation.ConfirmPassword; import com.mobsandgeeks.saripaar.annotation.NotEmpty; import com.mobsandgeeks.saripaar.annotation.Password; import com.pixplicity.easyprefs.library.Prefs; import com.weiwangcn.betterspinner.library.BetterSpinner; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; public class ChangeLoginPasswordActivity extends TopMenuActivity { //AwesomeValidation awesomeValidation = new AwesomeValidation(ValidationStyle.BASIC); @BindView(R.id.etCurrentPassword) @NotEmpty TextInputEditText etCurrentPassword; @BindView(R.id.txtChangeLogInMessage) TextView txtChangeLogInMessage; @BindView(R.id.txtChangePassTitle) TextView txtChangePassTitle; @BindView(R.id.rootLinearLayout) LinearLayout rootLinearLayout; @BindView(R.id.textInputLayout1) TextInputLayout textInputLayout1; @BindView(R.id.textInputLayout2) TextInputLayout textInputLayout2; @BindView(R.id.textInputLayout3) TextInputLayout textInputLayout3; @BindView(R.id.etNewPassword) @Password TextInputEditText etNewPassword; @BindView(R.id.etConfirmPassword) @ConfirmPassword TextInputEditText etConfirmPassword; @BindView(R.id.top_menu) LinearLayout topMenu; private CustomLoadingDialog dialog; private Validator validator; private String authToken; String message; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_change_login_password); //awesomeValidation.addValidation(ChangeLoginPasswordActivity.this, R.id.etCurrentPassword, "[a-zA-Z0-9_-]+", R.string.emptyError); ButterKnife.bind(this); setTopMenu(); if (getIntent().getStringExtra("force") != null) topMenu.setVisibility(View.GONE); else { topMenu.setVisibility(View.VISIBLE); } dialog = new CustomLoadingDialog(this); authToken = Prefs.getString(PreferencesKey.AUTH_TOKEN, null); callMessageApi(); validator = new Validator(this); validator.setValidationListener(new Validator.ValidationListener() { @Override public void onValidationSucceeded() { callApi(); } @Override public void onValidationFailed(List<ValidationError> errors) { for (ValidationError error : errors) { View view = error.getView(); String message = error.getCollatedErrorMessage(ChangeLoginPasswordActivity.this); if (view instanceof AppCompatEditText) { ((AppCompatEditText) view).setError(message); } if (view instanceof TextInputEditText) { ((TextInputEditText) view).setError(message); } else if (view instanceof BetterSpinner) { ((BetterSpinner) view).setError(message); } else { Snackbar.make(rootLinearLayout, message, Snackbar.LENGTH_LONG).show(); } } } }); } private void callApi() { dialog.show(); LoginPasswordChangeRequest request = new LoginPasswordChangeRequest(); request.setOldPassword(etCurrentPassword.getText().toString()); request.setNewPassword(etNewPassword.getText().toString()); request.setUserName(Prefs.getString(PreferencesKey.USER_ID, "")); request.setIpAddress(""); Call<BaseResponse> call = ApiProvider.getApiClient().changeLoginPassword(authToken, request); call.enqueue(new Callback<BaseResponse>() { @Override public void onResponse(Call<BaseResponse> call, Response<BaseResponse> response) { if (response.isSuccessful()) { if (response.body().getResponseCode() == ResponseCode.OPERATION_SUCCESSFUL.getCode()) { Snackbar.make(rootLinearLayout, "Password changed successfully", Snackbar.LENGTH_INDEFINITE) .setAction("Done", new View.OnClickListener() { @Override public void onClick(View view) { Prefs.clear(); Intent intent = new Intent(getApplicationContext(), LogInActivity.class); startActivity(intent); } }).show(); } else if (response.body().getResponseCode() == ResponseCode.AUTHENTICATION_FAILED.getCode()) { if (getIntent().getStringExtra("force") != null) { Toast.makeText(getApplicationContext(), "Mismatch Information.", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), MessageText.TOKEN_EXPIRED_MSG, Toast.LENGTH_LONG).show(); gotoLogin(); finish(); } } else if (response.body().getResponseCode() == ResponseCode.INVALID_ARGUMENT.getCode()) { Snackbar.make(rootLinearLayout, response.body().getErrors().get(0), Snackbar.LENGTH_LONG).show(); } else { Snackbar.make(rootLinearLayout, MessageText.ERROR_MSG, Snackbar.LENGTH_LONG).show(); } } else { Snackbar.make(rootLinearLayout, MessageText.ERROR_MSG, Snackbar.LENGTH_LONG).show(); } dialog.cancel(); } @Override public void onFailure(Call<BaseResponse> call, Throwable t) { dialog.cancel(); Snackbar.make(rootLinearLayout, MessageText.ERROR_MSG, Snackbar.LENGTH_LONG).show(); } }); } @OnClick(R.id.backBtn) public void back(View view) { checkAuthAndGotoActivity(ChangeLoginPasswordActivity.this, ServicesActivity.class); } @OnClick(R.id.submitButton) public void submit(View view) { validator.validate(); } public void callMessageApi() { dialog.show(); ApiProvider.getApiClient().getMessageChangeLogin(authToken).enqueue(new Callback<ChangeLogInMessageModel>() { @Override public void onResponse(Call<ChangeLogInMessageModel> call, Response<ChangeLogInMessageModel> response) { if (response.isSuccessful()) { message = response.body().getItems(); showMessage(); dialog.cancel(); } else { dialog.cancel(); Snackbar.make(rootLinearLayout, response.body().getErrors().get(0).toString(), Snackbar.LENGTH_LONG).show(); } } @Override public void onFailure(Call<ChangeLogInMessageModel> call, Throwable t) { Snackbar.make(rootLinearLayout, MessageText.ERROR_MSG, Snackbar.LENGTH_LONG).show(); } }); } public void showMessage() { if (message == null) { } else { String steps = "Note: " + message; String title = "Change Password"; SpannableString ss1 = new SpannableString(title); ss1.setSpan(new StyleSpan(Typeface.BOLD), 0, ss1.length(), 0); txtChangePassTitle.append(ss1); txtChangePassTitle.append("\n"); txtChangePassTitle.append(steps); } } @Override public void onBackPressed() { checkAuthAndGotoActivity(ChangeLoginPasswordActivity.this, ServicesActivity.class); overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left); } }

最满意答案

查看instanceof AppCompatEditText查看instanceof TextInputEditText都返回true 。 所以,它设置了两个错误图标。

您可以在onValidationFailed()方法中更改条件,以避免出现这种情况。

if (view.getClass().getSimpleName().equalsIgnoreCase("AppCompatEditText")) { ((AppCompatEditText) view).setError(message); } else if (view.getClass().getSimpleName().equalsIgnoreCase("TextInputEditText")) { TextInputLayout textInputLayout = (TextInputLayout) view.getParent().getParent(); textInputLayout.setErrorEnabled(true); textInputLayout.setError(message); }

view instanceof AppCompatEditText and view instanceof TextInputEditText both return true. So, it's set two error icon.

You can change your conditions in onValidationFailed() method as bellow to avoid this scenario.

if (view.getClass().getSimpleName().equalsIgnoreCase("AppCompatEditText")) { ((AppCompatEditText) view).setError(message); } else if (view.getClass().getSimpleName().equalsIgnoreCase("TextInputEditText")) { TextInputLayout textInputLayout = (TextInputLayout) view.getParent().getParent(); textInputLayout.setErrorEnabled(true); textInputLayout.setError(message); }

更多推荐

本文发布于:2023-07-26 17:44:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1278856.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:时会   标志   错误   两个   EditText

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!