我想在弹出窗口中显示
EdiText
字段的所有验证错误,如下图所示:
据我所知Android有drawables:
1) popup_inline_error.9.png
2) popup_inline_error_above.9.png
3)indicator_input_error.png
我可以使用以下方法在
EditText
右侧显示红色错误指示器:
Drawable err_indiactor = getResources().getDrawable(R.drawable.indicator_input_error);
mEdiText.setCompoundDrawablesWithIntrinsicBounds(null, null, err_indiactor, null);
现在我也想显示错误消息,如图所示是第一张图片,但似乎我对此没有任何想法,尽管我认为它应该是一个自定义吐司。
由于之前的答案是我的问题的解决方案,但我尝试了一种不同的方法来使用自定义可绘制图像而不是默认的
indicator_input_error
图像。
所以,我刚刚在布局 xml 文件中创建了两个
EditText
,然后在 Java 代码中实现了一些 Listener
EditText
。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:padding="20dip"
android:background="#222222">
<EditText android:layout_width="match_parent"
android:layout_height="wrap_content" android:hint="Username"
android:id="@+id/etUsername" android:singleLine="true"
android:imeActionLabel="Next"></EditText>
<EditText android:layout_width="match_parent"
android:inputType="textPassword"
android:layout_height="wrap_content" android:hint="Password"
android:id="@+id/etPassword" android:singleLine="true"
android:imeActionLabel="Next"></EditText>
</LinearLayout>
import java.util.regex.Pattern;
import android.app.Activity;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
public class EditTextValidator extends Activity {
private EditText mUsername, mPassword;
private Drawable error_indicator;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Setting custom drawable instead of red error indicator,
error_indicator = getResources().getDrawable(R.drawable.emo_im_yelling);
int left = 0;
int top = 0;
int right = error_indicator.getIntrinsicHeight();
int bottom = error_indicator.getIntrinsicWidth();
error_indicator.setBounds(new Rect(left, top, right, bottom));
mUsername = (EditText) findViewById(R.id.etUsername);
mPassword = (EditText) findViewById(R.id.etPassword);
// Called when user type in EditText
mUsername.addTextChangedListener(new InputValidator(mUsername));
mPassword.addTextChangedListener(new InputValidator(mPassword));
// Called when an action is performed on the EditText
mUsername.setOnEditorActionListener(new EmptyTextListener(mUsername));
mPassword.setOnEditorActionListener(new EmptyTextListener(mPassword));
}
private class InputValidator implements TextWatcher {
private EditText et;
private InputValidator(EditText editText) {
this.et = editText;
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (s.length() != 0) {
switch (et.getId()) {
case R.id.etUsername: {
if (!Pattern.matches("^[a-z]{1,16}$", s)) {
et.setError("Oops! Username must have only a-z");
}
}
break;
case R.id.etPassword: {
if (!Pattern.matches("^[a-zA-Z]{1,16}$", s)) {
et.setError("Oops! Password must have only a-z and A-Z");
}
}
break;
}
}
}
}
private class EmptyTextListener implements OnEditorActionListener {
private EditText et;
public EmptyTextListener(EditText editText) {
this.et = editText;
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT) {
// Called when user press Next button on the soft keyboard
if (et.getText().toString().equals(""))
et.setError("Oops! empty.", error_indicator);
}
return false;
}
}
}
现在我已经测试了它:
对于空的 EditText 验证:
假设用户单击
Username
字段,然后 Softkeybord 打开,如果用户按 Next
键,则用户将聚焦于 Password
字段,并且 Username
字段保持为空,则错误将显示如下所示下面的图片:
对于错误的输入验证:
1)我在用户名字段中输入文本
vikaS
,然后错误将如下图所示:
2)我在密码字段中输入文本
Password1
,然后错误将如下图所示:
这里我仅在用户将 EditText 字段留空并按键盘上的 Next 键的情况下使用自定义可绘制对象,但您可以在任何情况下使用它。只需要在
Drawable
方法中提供 setError()
对象即可。
尝试以下操作:
final EditText editText = (EditText) findViewById(R.id.edit);
editText.setImeActionLabel("", EditorInfo.IME_ACTION_NEXT);
editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT) {
if (editText.getText().toString().isBlank())
editText.setError("Please enter something.");
else
Toast.makeText(getApplicationContext(), "Entered: " + editText.getText().toString(), Toast.LENGTH_SHORT).show();
}
return false;
}
});
我知道答案已被提问者接受,但以上方法都不适合我。
我能够在运行 Android 4.0.3 的 Nexus S 上重现此问题。
这就是我的工作原理。
创建主题:
<style name="MyApp.Theme.Light.NoTitleBar" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:textColorPrimaryInverse">@android:color/primary_text_light
</item>
</style>
将
MyApp.Theme.Light.NoTitleBar
主题从清单应用到我的应用程序/活动。
<application
android:name=".MyApp"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/MyApp.Theme.Light.NoTitleBar"
>