服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android EditText追加空格、限制字符等方法示例

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

2022-10-20 14:24denko Android

这篇文章主要给大家介绍了关于Android EditText追加空格、限制字符等的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

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

追加字符

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
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种实现方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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效果

系统自带

?
1
2
3
4
5
6
7
8
9
10
11
<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.明文、密文

?
1
2
3
4
5
6
7
8
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.默认不获取焦点

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

?
1
android:focusableInTouchMode="true"

一些第三方库

MaterialEditText

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

 Masked-Edittext

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

XEditText

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

总结

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

原文链接:https://juejin.im/post/5cff6fdaf265da1bab29a516

延伸 · 阅读

精彩推荐