3.TextInputLayout验证输入合法性
对于这类需求想必随处可以,比如要你输入电话号码,你去随便输入一通,肯定会提示你格式不正确,那么TextInputLayout自带显示错误信息功能,不需要你设置额外的控件来提示用户,你会用到TextInputLayout中的setError与setErrorEnabled,前者是提示用户输入错误的信息,后则是当你输入错误后又输入正确,那么其会隐藏刚才的错误信息。
下面我们写按钮的点击事件的监听方法:
this.okBut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideKeyboard();
String username = usernameTil.getEditText().getText().toString();//获取用户名输入框字符串
String password = passwordTil.getEditText().getText().toString();//获取密码输入框字符串
if (!validateEmail(username)) {
//如果错误显示错误信息
usernameTil.setError(getResources().getString(R.string.login_username_validate_error_string));
return;
} else {
//否则隐藏上次错误
usernameTil.setErrorEnabled(false);
}
if (!validatePassword(password)) {
//设置密码错误信息
passwordTil.setError(getResources().getString(R.string.login_password_validate_error_string));
return;
} else {
//否则隐藏上次错误
passwordTil.setErrorEnabled(false);
}
Snackbar.make(MainActivity.this.findViewById(R.id.lyj_layout), "登录成功", Snackbar.LENGTH_SHORT).show();
}
});
当你点击按钮的时候,你会判断你的密码和用户名是否输入正确,如果不正确会得到如图所示的提示:

主要的代码都在上面,不过这里还有一个几个附带功能代码有必要介绍一下:
①点击按钮关闭输入键盘
每个应用的登录界面在点击登录按钮后输入键盘都会被关闭,如果你不关闭,会降低用户的体验的,那么关闭输入键盘的代码如下:
private void hideKeyboard() {
View view = getCurrentFocus();
if (view != null) {
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).
hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
②验证输入的是否为邮箱
private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&'()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";
private Pattern pattern = Pattern.compile(EMAIL_PATTERN);
private Matcher matcher;
/***
* 验证输入格式是否为邮箱
* @param email
* @return
*/
public boolean validateEmail(String email) {
matcher = pattern.matcher(email);
return matcher.matches();
}
至于那一串正则表达式有兴趣可以了解,没兴趣没关系,匹配字符串永远就那么几个比如电话,密码,邮箱,姓名等,百度上经典的完整的正则表达式一大堆,比你写的好的人多了。基本了解符号意思就够了,用的时候复制粘贴。
③密码验证
这里简单设置了大于5位:
public boolean validatePassword(String password) {
return password.length() > 5;
}
本篇博文源码下载地址:
http://download.csdn.net/detail/liyuanjinglyj/9388101
4.分析Snackbar使用代码
记得前面用到一句话snackbar,那么这里还是一起介绍了吧。专门用一篇博文讲解这个类似于Toast的Snackbar有点大材小用的意思,不过你真的完全了解Snackbar怎么使用吗?下面我们将一一介绍其使用方式。
this.fabOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar.dismiss();
}
});
this.fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar = Snackbar.make(coordinatorLayout, "我是Snackbar", Snackbar.LENGTH_SHORT)
.setAction("你好", new View.OnClickListener() {
@Override
public void onClick(View v) {
PopupMenu popupMenu = new PopupMenu(MainActivity.this, fab);
popupMenu.getMenuInflater().inflate(R.menu.menu_main, popupMenu.getMenu());
popupMenu.show();
}
});
snackbar.setDuration(4000);
snackbar.setActionTextColor(ColorStateList.valueOf(Color.RED));
snackbar.getView().setBackgroundColor(Color.BLUE);
snackbar.setCallback(new Snackbar.Callback() {
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
Log.i("liyuanjinglyj", "我显示了你知道吗?");
}
@Override
public void onDismissed(Snackbar snackbar, int event) {
super.onDismissed(snackbar, event);
Log.i("liyuanjinglyj", "我关闭了你知道吗?");
}
});
snackbar.show();
}
});
上面的代码基本囊括了Snackbar的所有方法。下面我们将一一介绍其使用。
①其构造方法有两个如下:
make(View view, int resId, int duration)
Make a Snackbar to display a message.
make(View view, CharSequence text, int duration)
Make a Snackbar to display a message
Snackbar will try and find a parent view to hold Snackbar's view from the value given to view.
唯一的区别在于第二个参数,一个引用资源ID字符串,一个直接使用字符串。
②setAction:其有也有两个方法与构造方法一样,引用字符串与直接使用字符串的区别。
效果如下:

显示的字符串在黑色圈圈里,并且点击后会调用回调函数,与点击Button效果一样。
③setDuration:设置其显示的时间,单位毫秒,这里为4毫秒。
④setActionTextColor:就是setAction第一个字符串的颜色。
⑤getView().setBackgroundColor(Color.BLUE):设置其snackbar背景
⑥setCallback:设置回调函数,负责监听snackbar的显示与隐藏:显示调用onShown方法,隐藏调用onDismissed。效果如下:

⑦show():很显然为显示
⑧dismiss:当显示的snackbar还显示在界面没有关闭的时候,调用该方法,snackbar会立即关闭。
这段代码实现的效果就如下:

记住将snackbar构造方法的第一个参数设置为CoordinatorLayout容器,就不会遮盖FAB按钮。