热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

AndroidEditText追加空格、限制字符等方法示例

前言 使用输入框时产品常常会有一些需求,比如123456789变成123-456-789或者限制一些字符的输入等等。很多时候都是网上搜索就

前言

使用输入框时产品常常会有一些需求,比如123456789变成123-456-789或者限制一些字符的输入等等。很多时候都是网上搜索就完事了,但是每次都去搜索有点浪费时间,而且有些也不符合需求。所以自己写一篇,以后就可以吃老本了。😝

追加字符

借鉴博客EditText每4位自动添加空格

import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;

import com.ifreegroup.ebbly.lib_common.utils.AppLogUtil;

/**
 * @Describe:自动添加占位符的输入框
 * @Date: 2019/06/11
 * @Author: dengkewu
 * @Contact:
 */
public class PlaceHolderEditText extends android.support.v7.widget.AppCompatEditText {
 //上次输入框中的内容
 private String lastString;
 //光标的位置
 private int selectPosition;
 //输入框内容改变监听
 private TextChangeListener listener;

 //追加字符
 private String item = "-";

 public PlaceHolderEditText(Context context) {
 super(context);
 initView();
 }

 public PlaceHolderEditText(Context context, AttributeSet attrs) {
 super(context, attrs);

 initView();
 }

 public PlaceHolderEditText(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 initView();
 }

 private void initView() {
 addTextChangedListener(new TextWatcher() {
 @Override
 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
 }


 /**
 * 当输入框内容改变时的回调
 * @param s 改变后的字符串
 * @param start 改变之后的光标下标
 * @param before 删除了多少个字符
 * @param count 添加了多少个字符
 */
 @Override
 public void onTextChanged(CharSequence s, int start, int before, int count) {


 //因为重新排序之后setText的存在
 //会导致输入框的内容从0开始输入,这里是为了避免这种情况产生一系列问题
 if (start == 0 && count > 1 && getSelectionStart() == 0) {
  return;
 }

 String textTrim = getText().toString().trim();
 if (TextUtils.isEmpty(textTrim)) {
  return;
 }

 //如果 before >0 && count == 0,代表此次操作是删除操作
 if (before > 0 && count == 0) {
  selectPosition = start;
  if (TextUtils.isEmpty(lastString)) {
  return;
  }
  //将上次的字符串去空格 和 改变之后的字符串去空格 进行比较
  //如果一致,代表本次操作删除的是空格
  if (textTrim.equals(lastString.replaceAll(item, ""))) {
  //帮助用户删除该删除的字符,而不是空格
  StringBuilder stringBuilder = new StringBuilder(lastString);
  stringBuilder.deleteCharAt(start - 1);
  selectPosition = start - 1;
  setText(stringBuilder.toString());
  }
 } else {
  //此处代表是添加操作
  //当光标位于空格之前,添加字符时,需要让光标跳过空格,再按照之前的逻辑计算光标位置
  if ((start + count) % 5 == 0) {
  selectPosition = start + count + 1;
  } else {
  selectPosition = start + count;
  }
 }
 }


 @Override
 public void afterTextChanged(Editable s) {
 //获取输入框中的内容,不可以去空格
 String etCOntent= getText().toString();
 if (TextUtils.isEmpty(etContent)) {
  if (listener != null) {
  listener.textChange("");
  }
  return;
 }
 //重新拼接字符串
 String newCOntent= addSpaceByCredit(etContent);
 //保存本次字符串数据
 lastString = newContent;

 //如果有改变,则重新填充
 //防止EditText无限setText()产生死循环
 if (!newContent.equals(etContent)) {
  setText(newContent);
  try {
  //保证光标的位置
  setSelection(selectPosition > newContent.length() ? newContent.length() : selectPosition);
  } catch (Exception e) {
  //刚好为限制字符的整数倍时添加空格后会出现越界的情况
  //AppLogUtil.e("超过限制字符");
  }

 }
 //触发回调内容
 if (listener != null) {
  listener.textChange(newContent);
 }

 }
 });
 }


 /**
 * 输入框内容回调,当输入框内容改变时会触发
 */
 public interface TextChangeListener {
 void textChange(String text);
 }

 public void setTextChangeListener(TextChangeListener listener) {
 this.listener = listener;

 }

 /**
 * 每4位添加一个空格
 *
 * @param content
 * @return
 */
 public String addSpaceByCredit(String content) {
 if (TextUtils.isEmpty(content)) {
 return "";
 }
 cOntent= content.replaceAll(item, "");
 if (TextUtils.isEmpty(content)) {
 return "";
 }
 StringBuilder newString = new StringBuilder();
 for (int i = 1; i <= content.length(); i++) {
 if (i % 4 == 0 && i != content.length()) {
 newString.append(content.charAt(i - 1) + item);
 } else {
 newString.append(content.charAt(i - 1));
 }
 }
 return newString.toString();
 }

 /**
 * 获取追加字符前输入内容
 * @return
 */
 public String getInputText() {
 return getText().toString().replaceAll(item, "");
 }
}

&#8195; 核心思路是在文本改变时获取到原字符串取出每一个字符添加上要追加的字符后返回字符串并重新setText。当然中间会有一些坑,比如光标位置、删除时空格要跳过以及删除后会再追加空格会造成死循环的问题。当然这里很多情况已经处理过了,如果有其他需求比如手机号码的111 1111 1111的形式可以修改addSpaceByCredit这个方法。

限制字符

借鉴博客Android EditText限制输入字符的5种实现方式

 et_traveler_content.addTextChangedListener(new TextWatcher() {
 @Override
 public void beforeTextChanged(CharSequence s, int start, int count, int after) {

 }

 @Override
 public void onTextChanged(CharSequence s, int start, int before, int count) {
  String editable = et_traveler_content.getText().toString();
  String str = stringFilter(editable.toString());
  if (!editable.equals(str)) {
  et_traveler_content.setText(str);
  //设置新的光标所在位置
  et_traveler_content.setSelection(et_traveler_content.getText().toString().length());
  }
 }

 @Override
 public void afterTextChanged(Editable s) {

 }
 });
 
 
 public String stringFilter(String str) {
 // 只允许字母、数字、英文空白字符
 String regEx = "[^a-zA-Z0-9\\s]";
 Pattern p = Pattern.compile(regEx);
 Matcher m = p.matcher(str);
 return m.replaceAll("");
 }

&#8195; 这里也是输入时做过滤然后重新setText。只要需要对正则表达式熟悉想做什么限制都可以。

MD效果

系统自带

 

  
 

只需要用TextInputLayout包裹一层便可以实现MD效果。

常用属性

1.明文、密文

 if (isShowPwd) {
 // 可视密码输入
 setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo
  .TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
 } else {
 // 非可视密码状态
 setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
 }

2.默认不获取焦点

父容器设置(其实只要布局内有一个控件设置就可以)

android:focusableInTouchMode="true"

一些第三方库

MaterialEditText

 Masked-Edittext

XEditText

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。


推荐阅读
  • 原理:dismiss再弹出,把dialog设为全局对象。if(dialog!null&&dialog.isShowing()&&!(Activity.)isFinishing()) ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • 本文详细介绍了在Centos7上部署安装zabbix5.0的步骤和注意事项,包括准备工作、获取所需的yum源、关闭防火墙和SELINUX等。提供了一步一步的操作指南,帮助读者顺利完成安装过程。 ... [详细]
  • hadoop1.2.1文档中这样写:Nowcheckthatyoucansshtothelocalhostwithoutapassphrase:$sshlocalhostIfyou ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 胡蜂能进行逻辑推理的研究成果
    最新研究表明,胡蜂具备一定的逻辑推理能力,能够进行传递性推理。研究人员通过实验发现,胡蜂在避免电击的测试中,能够正确选择符合逻辑的选项。这项研究成果对于了解无脊椎动物的认知能力具有重要意义,也为解析胡蜂社会结构的进化提供了线索。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • docker增加restart=always, docker重启后自动启动容器的方法
    本文介绍了在运行docker容器时如何添加参数来保证每次docker服务重启后容器也自动重启的方法,以及如何使用命令来更新已启动的容器。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
author-avatar
阿尼陀佛1314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有