当前位置: 首页 > news >正文

Material Design之TextInputLayout使用示例

Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更加规范的MD设计风格的控件。最重要的是,Android Design Support Library的兼容性更广,直接可以向下兼容到Android 2.2。这不得不说是一个良心之作。

效果图:

在项目的build.gradle文件中,添加下面的依赖(dependencies),并同步工程。

[java] view plain copy
 
print?在CODE上查看代码片派生到我的代码片
  1. dependencies {  
  2.     compile 'com.android.support:appcompat-v7:23.1.1'  
  3.     compile 'com.android.support:design:23.1.0'  
  4. }  
dependencies {
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.0'
}

布局文件:

 

[html] view plain copy
 
print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
    2.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.              android:layout_width="match_parent"  
    4.              android:layout_height="match_parent"  
    5.              android:orientation="vertical">  
    6.  
    7.    <android.support.design.widget.TextInputLayout  
    8.        android:layout_width="match_parent"  
    9.        android:layout_height="wrap_content"  
    10.        android:id="@+id/usernameWrapper"  
    11.        android:layout_marginTop="32dp"  
    12.        android:focusable="true"  
    13.        android:focusableInTouchMode="true">  
    14.        <EditText  
    15.            android:layout_width="match_parent"  
    16.            android:layout_height="wrap_content"  
    17.            android:inputType="textEmailAddress"  
    18.            android:hint="请输入账号"  
    19.            android:ems="10"  
    20.            android:id="@+id/username" />  
    21.    </android.support.design.widget.TextInputLayout>  
    22.  
    23.  
    24.    <android.support.design.widget.TextInputLayout  
    25.        android:layout_width="match_parent"  
    26.        android:layout_height="wrap_content"  
    27.        android:id="@+id/passwordWrapper">  
    28.        <EditText  
    29.            android:inputType="textPassword"  
    30.            android:id="@+id/password"  
    31.            android:hint="请输入密码"  
    32.            android:layout_width="match_parent"  
    33.            android:layout_height="wrap_content"/>  
    34.    </android.support.design.widget.TextInputLayout>  
    35.  
    36.    <Button  
    37.        android:onClick="login"  
    38.        android:layout_marginTop="16dp"  
    39.        android:layout_width="match_parent"  
    40.        android:layout_height="wrap_content"  
    41.        android:layout_gravity="right"  
    42.        android:text="登录"  
    43.        android:id="@+id/login"  
    44.        android:textColor="#009999"/>  
    45.</LinearLayout>  

     

如果布局这样设置了,运行起来没有动画效果的话,那么需要在Activity中初始化了,我是没有遇到过这个问题。

 

 

TextInputLayout另一个很赞的功能是,可以处理错误情况。通过验证用户输入,你可以防止用户输入错误的邮箱,或者输入不符合规则的密码。 
有些输入验证,验证是在后台做得,产生错误后会反馈给前台,最后展示给用户。非常耗时而且用户体验差。最好的办法是在请求后台前做校验。


假设是验证邮箱账号,验证邮箱稍微有些复杂,我们可以用Apache Commons library 来做这个事。我这里用一个维基百科里的正则表达式。

[java] view plain copy
 
print?在CODE上查看代码片派生到我的代码片
  1. private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&‘()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";  
  2. private Pattern pattern = Pattern.compile(EMAIL_PATTERN);  
  3. private Matcher matcher;  
  4.   
  5. //判断账号的格式,这里是邮箱的格式  
  6. public boolean validateEmail(String email) {  
  7.     matcher = pattern.matcher(email);  
  8.     return matcher.matches();  
  9. }  
1  private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&‘()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";
2     private Pattern pattern = Pattern.compile(EMAIL_PATTERN);
3     private Matcher matcher;
4 
5     //判断账号的格式,这里是邮箱的格式
6     public boolean validateEmail(String email) {
7         matcher = pattern.matcher(email);
8         return matcher.matches();
9     }

 


全部代码:

 

[java] view plain copy
 
print?在CODE上查看代码片派生到我的代码片
  1 package com.zhangli.mylayout;  
  2 2.  
  3 3.import android.content.Context;  
  4 4.import android.os.Bundle;  
  5 5.import android.support.design.widget.TextInputLayout;  
  6 6.import android.support.v7.app.AppCompatActivity;  
  7 7.import android.view.View;  
  8 8.import android.view.inputmethod.InputMethodManager;  
  9 9.import android.widget.Toast;  
 10 10.  
 11 11.import java.util.regex.Matcher;  
 12 12.import java.util.regex.Pattern;  
 13 13.  
 14 14.public class MainActivity extends AppCompatActivity  {  
 15 15.  
 16 16.    private TextInputLayout usernameWrapper;  
 17 17.    private TextInputLayout passwordWrapper;  
 18 18.  
 19 19.    @Override  
 20 20.    protected void onCreate(Bundle savedInstanceState) {  
 21 21.        super.onCreate(savedInstanceState);  
 22 22.        setContentView(R.layout.activity_main);  
 23 23.  
 24 24.        usernameWrapper= (TextInputLayout) findViewById(R.id.usernameWrapper);  
 25 25.        passwordWrapper= (TextInputLayout) findViewById(R.id.passwordWrapper);  
 26 26.  
 27 27.    }  
 28 28.  
 29 29.    public void login(View v){  
 30 30.        hideKeyboard();  
 31 31.        String username = usernameWrapper.getEditText().getText().toString();  
 32 32.        String password = passwordWrapper.getEditText().getText().toString();  
 33 33.  
 34 34.        if (!validateEmail(username)) {  
 35 35.            usernameWrapper.setError("账号格式不正确");  
 36 36.        }else if (!validatePassword(password)) {  
 37 37.            passwordWrapper.setError("密码不能小于6位数");  
 38 38.        }else{  
 39 39.            doLogin();  
 40 40.        }  
 41 41.    }  
 42 42.  
 43 43.    //让键盘弹回去  
 44 44.    private void hideKeyboard() {  
 45 45.        View view = getCurrentFocus();  
 46 46.        if (view != null) {  
 47 47.            ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).  
 48 48.                    hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);  
 49 49.        }  
 50 50.    }  
 51 51.  
 52 52.    private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&‘()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";  
 53 53.    private Pattern pattern = Pattern.compile(EMAIL_PATTERN);  
 54 54.    private Matcher matcher;  
 55 55.  
 56 56.    //判断账号的格式,这里是邮箱的格式  
 57 57.    public boolean validateEmail(String email) {  
 58 58.        matcher = pattern.matcher(email);  
 59 59.        return matcher.matches();  
 60 60.    }  
 61 61.  
 62 62.    //密码长度要大于5  
 63 63.    public boolean validatePassword(String password) {  
 64 64.        return password.getBytes().length>5;  
 65 65.    }  
 66 66.  
 67 67.    public void doLogin() {  
 68 68.        Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();  
 69 69.    }  
 70 70.}  
 71 package com.zhangli.mylayout;
 72 
 73 import android.content.Context;
 74 import android.os.Bundle;
 75 import android.support.design.widget.TextInputLayout;
 76 import android.support.v7.app.AppCompatActivity;
 77 import android.view.View;
 78 import android.view.inputmethod.InputMethodManager;
 79 import android.widget.Toast;
 80 
 81 import java.util.regex.Matcher;
 82 import java.util.regex.Pattern;
 83 
 84 public class MainActivity extends AppCompatActivity  {
 85 
 86     private TextInputLayout usernameWrapper;
 87     private TextInputLayout passwordWrapper;
 88 
 89     @Override
 90     protected void onCreate(Bundle savedInstanceState) {
 91         super.onCreate(savedInstanceState);
 92         setContentView(R.layout.activity_main);
 93 
 94         usernameWrapper= (TextInputLayout) findViewById(R.id.usernameWrapper);
 95         passwordWrapper= (TextInputLayout) findViewById(R.id.passwordWrapper);
 96 
 97     }
 98 
 99     public void login(View v){
100         hideKeyboard();
101         String username = usernameWrapper.getEditText().getText().toString();
102         String password = passwordWrapper.getEditText().getText().toString();
103 
104         if (!validateEmail(username)) {
105             usernameWrapper.setError("账号格式不正确");
106         }else if (!validatePassword(password)) {
107             passwordWrapper.setError("密码不能小于6位数");
108         }else{
109             doLogin();
110         }
111     }
112 
113     //让键盘弹回去
114     private void hideKeyboard() {
115         View view = getCurrentFocus();
116         if (view != null) {
117             ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).
118                     hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
119         }
120     }
121 
122     private static final String EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&‘()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$";
123     private Pattern pattern = Pattern.compile(EMAIL_PATTERN);
124     private Matcher matcher;
125 
126     //判断账号的格式,这里是邮箱的格式
127     public boolean validateEmail(String email) {
128         matcher = pattern.matcher(email);
129         return matcher.matches();
130     }
131 
132     //密码长度要大于5
133     public boolean validatePassword(String password) {
134         return password.getBytes().length>5;
135     }
136 
137     public void doLogin() {
138         Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
139     }
140 }

 


提示错误的方式还是很nice的,就是还没解决将错误提示清除的方法,传进null也不行,会报错,还请大神解答。hint的color在editText里设置不了,这里只用通过设置activity的style中的textColorHint来更改hint的颜色。

转载于:https://www.cnblogs.com/labixiaoxin/p/5275931.html

相关文章:

  • redis配置详情
  • JS 笔记(一)
  • 作业二:四则运算
  • Eclipse使用快捷键代码格式化有时失效解决办法
  • 出差(二十四)失控
  • Qt 在控件上面绘图 label,pushbutton。。。。。
  • 抽象类,继承,接口个人见解
  • 一周总结
  • Spring 通过maven pom文件配置初始化
  • 软件测试_实验1
  • 最近公共祖先(Least Common Ancestors)
  • JavaCodeTra 猴子选猴王 约瑟夫循环
  • jQuery简单实现图片预加载
  • HNOI2006-鬼谷子的钱袋
  • javascript中 if(变量)和if(变量==true)的区别
  • [NodeJS] 关于Buffer
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • angular2 简述
  • Angular2开发踩坑系列-生产环境编译
  • C++入门教程(10):for 语句
  • conda常用的命令
  • create-react-app项目添加less配置
  • Fabric架构演变之路
  • Nacos系列:Nacos的Java SDK使用
  • nodejs实现webservice问题总结
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PHP的类修饰符与访问修饰符
  • Ruby 2.x 源代码分析:扩展 概述
  • Zepto.js源码学习之二
  • 近期前端发展计划
  • 马上搞懂 GeoJSON
  • 免费小说阅读小程序
  • 扑朔迷离的属性和特性【彻底弄清】
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 学习ES6 变量的解构赋值
  • 优化 Vue 项目编译文件大小
  • 再次简单明了总结flex布局,一看就懂...
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • HanLP分词命名实体提取详解
  • mysql面试题分组并合并列
  • ​iOS实时查看App运行日志
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910