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按钮。