AndroidEditText追加空格、限制字符等⽅法⽰例
前⾔
使⽤输⼊框时产品常常会有⼀些需求,⽐如123456789变成123-456-789或者限制⼀些字符的输⼊等等。很多时候都是⽹上搜索就完事了,但是每次都去搜索有点浪费时间,⽽且有些也不符合需求。所以⾃⼰写⼀篇,以后就可以吃⽼本了。
追加字符
借鉴博客
t.Context;
Editable;
TextUtils;
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.placeAll(item, ""))) {
//帮助⽤户删除该删除的字符,⽽不是空格
StringBuilder stringBuilder = new StringBuilder(lastString);
stringBuilder.deleteCharAt(start - 1);
selectPosition = start - 1;
String());
}
} else {
//此处代表是添加操作
字符串函数gets怎么重新定义//当光标位于空格之前,添加字符时,需要让光标跳过空格,再按照之前的逻辑计算光标位置  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) {
}
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) {
}
}
});
}
/**
* 输⼊框内容回调,当输⼊框内容改变时会触发
*/
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 = placeAll(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));
}
}
String();
}
/**
* 获取追加字符前输⼊内容
* @return
*/
public String getInputText() {
return getText().toString().replaceAll(item, "");
}
}
 核⼼思路是在⽂本改变时获取到原字符串取出每⼀个字符添加上要追加的字符后返回字符串并重新setText。当然中间会有⼀些坑,⽐如光标位置、删除时空格要跳过以及删除后会再追加空格会造成死循环的问题。当然这⾥很多情况已经处理过了,如果有其他需求⽐如⼿机号码的111 1111 1111的形式可以修改addSpaceByCredit这个⽅法。
限制字符
借鉴博客
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_Text().toString();
String str = String());
if (!editable.equals(str)) {
et_traveler_content.setText(str);
//设置新的光标所在位置
et_traveler_content.setSelection(et_Text().toString().length());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
public String stringFilter(String str) {
// 只允许字母、数字、英⽂空⽩字符
String regEx = "[^a-zA-Z0-9\\s]";
Pattern p = Patternpile(regEx);
Matcher m = p.matcher(str);
placeAll("");
}
 这⾥也是输⼊时做过滤然后重新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"
⼀些第三⽅库
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。