Android开发——Material Design系列之TextInputLayout

TextInputLayout与TextInputEditText详解 导读:Android 从5.0版本开始,新增了Android Materia Design库,让开发者高效的实现炫酷的UI效果本篇文章将介绍Materia Design库的TextInputLayout与TextInputEditText组件TextInputLayout TextInputLayout用于辅助EditText,当用户输入文本时,在EditText上方显示浮动标签,这个标签的内容就是 阅读详情

0. 前言  

TextInputLayout 继承于 LinearLayout,专门用来包裹 EditText或EditText的子类,当用户进行输入动作的时候我们设置的android:hint 属性值会作为提示以动画的形式运动到输入框左上角,错误信息也显示在输入框的下方。有些输入验证是在后台做得,产生错误后再反馈给前台,这样非常耗时而且用户体验差。TextInputLayout则完美的解决了这个问题,达到了很好的用户体验效果。

先看一下效果图,后面慢慢进行实现的介绍。

1.  TextInputLayout的使用

dependencies {
    //…
    compile 'com.android.support:appcompat-v7:25.0.0'
    compile 'com.android.support:design:25.0.0
}

首先添加supportdesign依赖包,版本号最好和v7包一致。

2.  布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    tools:context="com.seucalvin.textinputlayout.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="65dp"
        android:orientation="vertical">

        <android.support.design.widget.TextInputLayout
            android:id="@+id/layout_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:counterEnabled="true"
            app:counterMaxLength="6">
            <!--app:counterOverflowTextAppearance="@style/MyOverflowText"-->
            <!--app:errorTextAppearance="@style/MyErrorStyle">-->

            <EditText
                android:id="@+id/input_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/EnterName"
                android:singleLine="true" />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:id="@+id/layout_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:counterEnabled="true"
            app:counterMaxLength="6">
            <!--app:counterOverflowTextAppearance="@style/MyOverflowText"-->
            <!--app:errorTextAppearance="@style/MyErrorStyle">-->

            <EditText
                android:id="@+id/input_password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/EnterPassWord"
                android:inputType="textPassword"
                android:singleLine="true" />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:id="@+id/layout_email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <!--app:counterOverflowTextAppearance="@style/MyOverflowText"-->
            <!--app:errorTextAppearance="@style/MyErrorStyle">-->

            <EditText
                android:id="@+id/input_email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/EnterEmail"
                android:inputType="textEmailAddress"
                />
        </android.support.design.widget.TextInputLayout>

        <Button
            android:id="@+id/login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="50dp"
            android:background="@color/colorPrimary"
            android:text="@string/login"
            android:textColor="#ffffff"
            android:textSize="20sp"
            android:textStyle="bold" />
    </LinearLayout>
</RelativeLayout>

布局很简单,一个用户名输入框和一个密码框,再加上一个email输入框和登陆按钮。

这里在用户名和密码输入框里所在的TextInputLayout中配置了app:counterEnabled=”true”属性即可进行效果图中的字数统计功能。当然,你也可以指定最大输入的字符数,这里使用app:counterMaxLength=”6”指定了最多输入6个字符。最后就是app:counterOverflowTextAppearance和app:errorTextAppearance两个属性,这里我都注释掉了,即使用的是系统默认的效果,两者都可以通过指定style进行自定义效果,前者为当输入字符超过限定个数时EditText控件的整体显示样式,比如可以自定义输入框的颜色的改变,注意如果要自定义style,parent属性要是TextAppearance.AppCompat.Small,后者即显示错误提示文字(输入框左下方)的属性,比如修改其颜色啊等等。

EditText的hint属性指定的是飘在输入框左上角的文字,那么左下角的错误提示文字是如何设置内容以及出现时机的呢?

3. 代码逻辑

首先肯定要响应EditText的输入事件,这样才能实时地检测是否输入有误。

input_name.addTextChangedListener(newMyTextWatcher(input_name));

这里MyTextWatcher实现了TextWatcher接口,并重写了该接口中的afterTextChanged()方法,在该方法中通过判断MyTextWatcher()构造函数中传来的控件id,来switch到底进行哪个输入框的逻辑判断,这里以邮件输入框的逻辑举例介绍:

String email = input_email.getText().toString().trim();
if (TextUtils.isEmpty(email) || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
    layout_email.setErrorEnabled(true);
    layout_email.setError(getString(R.string.error_email));
    layout_email.requestFocus();
}
layout_email.setErrorEnabled(false);

该逻辑在输入事件发生后实时回调,当检测到邮箱输入框为空或者邮箱格式有误时,会调用layout_eamil.setError()使所在的TextInputLayout左下角显示错误提示信息。否则传入false隐藏错误信息。这样就完成了效果图中的效果。

4. TextInputEditText

官方的实例中,TextInputLayout包裹的并不是EditText,而是TextInputEditText,它是EditText的子类,那么它和EditText有什么区别呢,官方给出的解释是,当你的输入框太大的时候,如下图所示:

点击输入框会进入全屏编辑模式,如下图所示,如果你使用的是EditText,则如下图所示:

而如果你使用的是TextInputEditText,则会在全屏编辑模式下依然显示出hint属性值,如下图所示:

5.  正则表达式工具类

Android开发中经常在登录逻辑中使用正则表达式校验邮箱、手机号、密码、身份证号码等信息,特意找到了一个工具类方便需要的同学使用。

/**
 * 校验器:利用正则表达式校验邮箱、手机号等
 * @author Mr.duan
 */
public class Validator {
    /**
     * 正则表达式:验证用户名(不包含中文和特殊字符)如果用户名使用手机号码或邮箱 则结合手机号验证和邮箱验证
     */
    public static final String REGEX_USERNAME = "^[a-zA-Z]\\w{5,17}$";

    /**
     * 正则表达式:验证密码(不包含特殊字符)
     */
    public static final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,16}$";

    /**
     * 正则表达式:验证手机号
     */
    public static final String REGEX_MOBILE = "^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$";

    /**
     * 正则表达式:验证邮箱
     */
    public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

    /**
     * 正则表达式:验证汉字(1-9个汉字)  {1,9} 自定义区间
     */
    public static final String REGEX_CHINESE = "^[\u4e00-\u9fa5]{1,9}$";

    /**
     * 正则表达式:验证身份证
     */
    public static final String REGEX_ID_CARD = "(^\\d{15}$)|(^\\d{17}([0-9]|X)$)";

    /**
     * 正则表达式:验证URL
     */
    public static final String REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";

    /**
     * 正则表达式:验证IP地址 
     */
    public static final String REGEX_IP_ADDR = "(2[5][0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})";

    /**
     * 校验用户名
     * @param username
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isUserName(String username) {
        return Pattern.matches(REGEX_USERNAME, username);
    }

    /**
     * 校验密码
     * @param password
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isPassword(String password) {
        return Pattern.matches(REGEX_PASSWORD, password);
    }

    /**
     * 校验手机号
     * @param mobile
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isMobile(String mobile) {
        return Pattern.matches(REGEX_MOBILE, mobile);
    }

    /**
     * 校验邮箱
     * @param email
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isEmail(String email) {
        return Pattern.matches(REGEX_EMAIL, email);
    }

    /**
     * 校验汉字
     * @param chinese
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isChinese(String chinese) {
        return Pattern.matches(REGEX_CHINESE, chinese);
    }

    /**
     * 校验身份证
     * @param idCard
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isIDCard(String idCard) {
        return Pattern.matches(REGEX_ID_CARD, idCard);
    }

    /**
     * 校验URL
     * @param url
     * @return 校验通过返回true,否则返回false
     */
    public static boolean isUrl(String url) {
        return Pattern.matches(REGEX_URL, url);
    }

    /**
     * 校验IP地址
     * @param ipAddress
     * @return
     */
    public static boolean isIPAddress(String ipAddress) {
        return Pattern.matches(REGEX_IP_ADDR, ipAddress);
    }

}

Android修行手册 - TextInputLayout使用学习 设置用于编辑文本在框模式下折叠的顶部填充的值。 阅读详情

相关推荐

Android Material Design实战:TextInputLayout让你的表单输入体验飞起来

本文深入解析Android Material Design中的TextInputLayout组件,通过实战演示如何优化表单输入体验。文章详细介绍了其核心设计哲学、基础集成方法,并重点讲解了如何实现优雅的错误处理、密码可见性切换、字符计数等高级功能,帮助开发者构建专业、流畅且符合Material Design规范的交互界面。

tgb3456789的博客 701

TextInputLayout只看这一篇就够了

前言 Google为了整体风格的Material化,对输入框进行了优化处理,视觉效果非常棒,并且整体非常丝滑。 先展示几个google为我们设计的风格。 <com.google.android.material.textfield.TextInputLayout ... style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"> </com.google.

柳的博客 8897

Android Material Design控件之TextInputLayout

Material Design控件之TextInputLayout,修饰EditText的布局,有且只有一个EditText,md风格UI显示:计数counter,动画提示hintAnimation,错误提示,密码显示按钮等

LinWeiJ的博客 740

Android Material Design 系列之 TextInputLayout 使用详解

前言 本文是 Material Design 系列第四篇:TextInputLayout 主要是作为 EditText 的容器,从而为 EditText 生成一个浮动的 Label,当用户点击 EditText 的时候,EditText 中的 hint 字符串会自动移到 EditText 的左上角。 TextInputLayout 的简单使用,是 Google 推出的整个 Material Design 库的一个缩影:Google 将 UI 视觉效果设计得华丽且流畅,同时代码封装更为优雅,开发者只需要在 l

一名互联网时代苟且偷生的 Android码农 2万+

Android Material Design兼容库实战指南

Material Design作为Android平台的设计语言规范,其核心价值在于提供统一的视觉交互体验。通过Material Components兼容库,开发者可以将Material 3设计特性向后兼容至Android 2.1系统。该技术方案解决了多版本系统间的UI一致性难题,大幅减少条件分支代码,内置符合规范的转场动画和触摸反馈机制。在电商、社交等需要覆盖广泛设备的应用场景中,Material Design兼容库能确保从API 7到最新版本的设计语言统一性。重点组件如NavigationView、Tex

456

Android 10 UI开发:Material Design与暗黑模式实践

Material Design是Android系统的设计语言,通过规范化的组件库和交互动画提升用户体验一致性。其核心原理基于色彩系统、排版比例和响应式交互,特别在Android 10中强化了暗黑模式支持。开发者使用Material Components库可以快速构建符合规范的界面,同时满足Google Play的强制深色主题要求。典型应用场景包括电商App的商品列表、社交媒体的信息流等,其中RecyclerView与ConstraintLayout的组合能实现高性能滚动布局。通过正确配置主题资源和处理多窗口

weixin_30319153的博客 329

强大的提示控件TextInputLayout使用以及源码分析

这里出现了一个mCollapsingTextHelper,通过它可以设置文字大小的加速动画,FAST_OUT_SLOW_IN_INTERPOLATOR,快出慢进的效果,还有设置位置的加速器setPositionInterpolator,setCollapsedTextGravity设置折叠文字的Gravity,看来这个mCollapsingTextHelper的作用还是很强大的,我们后面再看它的源码,先继续往下看。说明在源码中必定有添加这个提示的逻辑,这里我们后面在讨论,先继续往下看。

m0_56146626的博客 1467

Android Material Design 兼容库实践指南

Material Design 是 Android 系统的核心设计语言,通过标准化组件实现跨版本视觉一致性。其兼容库(Material Components for Android)解决了 UI 组件在 Android 5.0 及以上版本的适配问题,提供预设动画、触摸反馈等交互规范。作为现代移动开发的基础设施,该库能提升开发效率40%以上,特别适用于电商等高交互场景。技术实现上需配置 material:1.9.0 依赖,继承 Material3 主题,并掌握按钮体系、文本输入框等核心组件的使用技巧。深色模式

weixin_30781433的博客 493

Android更好用的原生组件

专门为设计(比如内部包含 RecyclerView、ViewPager、CoordinatorLayout 等可滑动控件),能让内外层滑动控件的交互更流畅,解决传统ScrollView嵌套滑动时的卡顿、冲突问题。对比 ScrollView传统ScrollViewScrollView而解决了这些问题,核心是实现了。

Sole_Xun的博客 937

Material Design输入组件实践:TextInputLayout与TextInputEditText

本文还有配套的精品资源,点击获取 简介:介绍Android中 TextInputLayout 和 TextInputEditText 组件,用于创建具有高级用户交互特性的表单。详细说明了组件的样式功能,包括浮动标签、错误提示、助手文本、前后缀文本及密码可见性切换。通过实例代码展示了如何实现这些功能,并强调了这些组件对于增强表单体验的重要性。 ...

weixin_30600615的博客 1667

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

Android Design风格组件之TextInputLayout

TextInputLayout特性 1其中包含的EditText则会让hint变成一个在EditText上方的浮动标签。同时还包括一个漂亮的material动画。 2它可以处理错误 3 统计输入框的字符数

mybook1122的专栏 2274

ChatGPT Plus账号被降智?3个实用检测方法+终极解决方案(附国内支付指南)

本文针对ChatGPT Plus账号性能下降问题,提供了3个科学检测方法和系统级解决方案。通过详细分析症状、专业诊断技巧和优化策略,帮助用户有效应对GPT-4o等高级功能失效、响应质量下降等问题,特别包含国内用户关心的支付方案和账号管理建议。

weixin_42639633的博客 474

安卓进阶——Material Design库

本文介绍了Android Material Design库中的12个核心组件及其应用场景。Toolbar替代传统ActionBar,提供灵活定制;NavigationView实现侧滑菜单;FloatingActionButton作为醒目操作按钮;Snackbar提供轻量提示;CardView展示卡片式布局;BottomSheetBehavior实现底部弹窗;DrawerLayout管理侧滑抽屉;CoordinatorLayout协调视图交互;AppBarLayout和CollapsingToolbarLay

Meteors.的博客 1150

【Spring源码三千问】哪些循环依赖问题Spring解决不了?

哪些循环依赖问题Spring解决不了?前言版本约定正文场景一: prototype 类型的循环依赖场景二: constructor 注入的循环依赖场景三:Proxy 类型的 Bean 的循环依赖小结 系列博文: 【老王读Spring IoC-0】Spring IoC 引入 【老王读Spring IoC-1】IoC 之控制反转引入 【老王读Spring IoC-2】IoC 之 BeanDefinition 扫描注册 【老王读Spring IoC-3】Spring bean 的创建过程 【老王读Spring I

老王的专栏 7319

打造你自己的小程序容器 —— 一套能装得下整个未来的跨端技术!

摘要: 本文介绍了一种基于Capacitor框架开发的轻量级“小程序容器”解决方案——LapDrop。通过模拟微信小程序的运行逻辑(动态加载、原生能力调用、沙盒环境),LapDrop允许开发者自主构建跨平台(iOS/Android/Web)的小程序生态。其核心利用Capacitor的插件桥接机制,实现JS与原生功能的无缝调用,并支持浏览器调试与原生环境一致化。优势包括插件化架构、状态隔离、热更新及开放权限控制,适用于企业级模块化应用或开发者工具。未来计划扩展生命周期管理、远程加载等功能,目标成为开源的小程序

CangYuChenAi的博客 976

安卓开发Material Design 3

摘要:Material Design 3(MD3)是Google推出的最新设计系统,通过动态色彩、增强可访问性和现代视觉风格提升用户体验。本文以"MD3Showcase"项目为例,详细介绍MD3在Android应用中的实现方法,包括主题配置、组件应用(如MaterialToolbar、MaterialCardView、Slider等)以及深色模式支持。项目展示了12+种核心组件,实现动态色彩、响应式设计和流畅交互,为开发者提供完整的MD3应用实践指南。

2301_80789262的博客 1009

android10 部分机型(华为)无法正常更新安装app

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file://storage/emulated/0/文件夹名/***.apk typ=application/vnd.android.package-archive }

森森先生的博客 3927

TLint用户界面设计:Material Design组件在虎扑体育应用中的实践

在移动应用开发领域,Material Design已经成为Android平台的设计标准。TLint作为一款基于虎扑体育API开发的第三方客户端,采用了Material Design设计语言,为用户提供了优秀的视觉体验和交互设计。本文将深入探讨TLint如何巧妙运用Material Design组件打造出色的虎扑体育应用界面。 ## 什么是Material Design?🤔 Material

gitblog_00835的博客 729

基于simulink的预测电流控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于预测电流控制策略的三相逆变器仿真方法。主要内容包括:准备工作(安装必要软件及工具箱)、构建三相逆变器基础模型、设计预测电流控制器(包含状态空间建模和控制器设计)、实现控制逻辑、添加示波器观察输出、配置仿真参数以及运行仿真分析结果。通过MATLAB代码示例和Simulink模块说明,展示了如何选择最优开关状态来最小化电流误差。该仿真方法为研究快速响应、高精度的逆变器控制提供了实用工具,但需注意实际应用中可能需要的调试工作。

amy_mhd的博客 276

人像美肤 人体美型 CVPR 2022 ABPN

人像美肤 CVPR 2022 ABPN

jacke121的专栏 841

[Android Material Design]组件08 - TextInputLayout

TextInputLayout控件对EditText进行了增强,当编辑框输入字符时,hint提示文字会显示在编辑框的上方,而且有一个滑上去的动画,给人丝滑的感觉

yurensan的博客 508

数学之美:欣赏超越数e

文章目录一、e为何物?二、利息与e的关系1、利息问题2、计算利息3、欣赏螺旋线(1)螺旋线概述(2)绘制螺旋线三、e和π 一、e为何物? e是一个无限不循环小数,其值约等于2.718281828…,它是一个超越数,有时也称为欧拉数(Euler’s Number)。 以e为底的对数称为自然对数(Natural Logarithm),数学中使用自然这个词的还有自然数(Natural Number)。 这里的“自然”并不是现代人所习惯的“大自然”,而是有点儿“天然存在,非人为”的意思。 二、利息与e的关系

howard2005的专栏 1718

Android Material Design新UI控件使用大全 一

序言自从谷歌在2014年的IO大会上推出了Material Design新的设计规范后,安卓应用的整体美观程度提升了很大的一个层次, 安卓再也不是又黑又丑的界面,取而代之的是拥有丰富的颜色,美观的按钮,好的用户体验

SmallCheric 5845

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android Material Design

Android Material Design 兼容库的使用详解 转自:http://www.jianshu.com/p/1e6eed09d48b 众所周知Material Design(材质设计)是Google在2014年I/O大会上发布的一种新的设计规范。一经推出就好评如潮,个人是非常喜欢这种风格的,由于他只支持5.0及其以上的设备,开发者也只是去尝尝鲜,并没用在真实的项目中去,使

ml_1995的博客 856

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 设计模式——责任链模式详解
下一篇: Android开发——收集应用Crash信息到服务器
SEU_Calvin
SEU_Calvin 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄11年 3万+粉丝 150原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值