前言

使用输入框时产品常常会有一些需求,比如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, "");
 }
}

  核心思路是在文本改变时获取到原字符串取出每一个字符添加上要追加的字符后返回字符串并重新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("");
 }

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

MD效果

系统自带

 <android.support.design.widget.TextInputLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_marginStart="15dp"
  android:padding="0dp"
  android:layout_centerVertical="true"
  android:gravity="center_vertical">

  <EditText
  …… />
 </android.support.design.widget.TextInputLayout>

只需要用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

总结

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

Android EditText追加空格、限制字符等方法示例的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  3. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  4. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  5. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

  6. ios – 如何使用Unicode十六进制值(UTF-16)在Swift中表达字符串

    我想在Swift中使用十六进制值编写一个Unicode字符串.我已经阅读了字符串和字符的documentation,所以我知道我可以使用特殊的Unicode字符直接在字符串如下:版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. iOS设备UDID是否区分大小写?

    这是关于将设备添加到供应门户以进行临时测试.客户端向我发送了一个带有大写字符的UDID,我愚蠢地添加了这些字符而没有检查.无线部署不起作用,我想知道这是否可能是原因,但我想在使用我的100个分配之一之前先检查.解决方法是的,UDID区分大小写.如果它不是数字,您可以浏览所有字符并将它们转换为小写字符.

  8. ios – 在NSString中查找俄语字符

    我必须检查Nsstring中是否存在俄语字符.我正在使用以下代码:但它总是返回FALSE.任何人都可以告诉我我的代码有什么问题吗?谢谢解决方法目前,您的条件检查字符串中不存在非俄语字符,而不是字符串中存在西里尔字符.对于完全由拉丁字母1中没有等效字符的西里尔字符组成的字符串,您的代码将返回YES.要解决此问题,请删除反转,然后反转检查,如下所示:1您忘记在列表中包含软停止,它看起来像小写字母b,但它不是相同的字符.

  9. ios – 计算Swift String的字节大小

    我正在尝试计算Swift中String的字节大小,但我不知道字符的大小是多少;一个编码的字节数是多少?假设我有一个字符串:让str=“你好,世界”我想将它发送到我的服务器,但我的服务器只接受32字节以下的字符串.我如何控制弦乐的长度?解决方法这一切都取决于字符编码,让我们假设UTF8:请注意,并非所有字符在UTF8中都具有相同的字节大小.如果您的字符串是ASCII,则可以假设每个字符有1个字节.

  10. ios – 如何找到包含给定字符的字体?

    我有一个字体,我用于我的应用程序,只使用英文字符.我使用CoreText来显示文本,我注意到只要有人输入了字体中没有包含的字符,程序就会挂起来:我有一些问题:>是否可以知道字体中是否包含某个字符?>系统是否可以找到包含未知字符的字体?相关:CheckifcertaincharacterissupportedbyUIFont解决方法1)是否可以知道字体中是否包含某个字符?

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部