Android EditText追加空格、限制字符等方法示例
前言
使用輸入框時(shí)產(chǎn)品常常會(huì)有一些需求,比如123456789變成123-456-789或者限制一些字符的輸入等等。很多時(shí)候都是網(wǎng)上搜索就完事了,但是每次都去搜索有點(diǎn)浪費(fèi)時(shí)間,而且有些也不符合需求。所以自己寫一篇,以后就可以吃老本了。😝
追加字符
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:自動(dòng)添加占位符的輸入框
* @Date: 2019/06/11
* @Author: dengkewu
* @Contact:
*/
public class PlaceHolderEditText extends android.support.v7.widget.AppCompatEditText {
//上次輸入框中的內(nèi)容
private String lastString;
//光標(biāo)的位置
private int selectPosition;
//輸入框內(nèi)容改變監(jiān)聽
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) {
}
/**
* 當(dāng)輸入框內(nèi)容改變時(shí)的回調(diào)
* @param s 改變后的字符串
* @param start 改變之后的光標(biāo)下標(biāo)
* @param before 刪除了多少個(gè)字符
* @param count 添加了多少個(gè)字符
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//因?yàn)橹匦屡判蛑髎etText的存在
//會(huì)導(dǎo)致輸入框的內(nèi)容從0開始輸入,這里是為了避免這種情況產(chǎn)生一系列問題
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;
}
//將上次的字符串去空格 和 改變之后的字符串去空格 進(jìn)行比較
//如果一致,代表本次操作刪除的是空格
if (textTrim.equals(lastString.replaceAll(item, ""))) {
//幫助用戶刪除該刪除的字符,而不是空格
StringBuilder stringBuilder = new StringBuilder(lastString);
stringBuilder.deleteCharAt(start - 1);
selectPosition = start - 1;
setText(stringBuilder.toString());
}
} else {
//此處代表是添加操作
//當(dāng)光標(biāo)位于空格之前,添加字符時(shí),需要讓光標(biāo)跳過空格,再按照之前的邏輯計(jì)算光標(biāo)位置
if ((start + count) % 5 == 0) {
selectPosition = start + count + 1;
} else {
selectPosition = start + count;
}
}
}
@Override
public void afterTextChanged(Editable s) {
//獲取輸入框中的內(nèi)容,不可以去空格
String etContent = getText().toString();
if (TextUtils.isEmpty(etContent)) {
if (listener != null) {
listener.textChange("");
}
return;
}
//重新拼接字符串
String newContent = addSpaceByCredit(etContent);
//保存本次字符串?dāng)?shù)據(jù)
lastString = newContent;
//如果有改變,則重新填充
//防止EditText無限setText()產(chǎn)生死循環(huán)
if (!newContent.equals(etContent)) {
setText(newContent);
try {
//保證光標(biāo)的位置
setSelection(selectPosition > newContent.length() ? newContent.length() : selectPosition);
} catch (Exception e) {
//剛好為限制字符的整數(shù)倍時(shí)添加空格后會(huì)出現(xiàn)越界的情況
//AppLogUtil.e("超過限制字符");
}
}
//觸發(fā)回調(diào)內(nèi)容
if (listener != null) {
listener.textChange(newContent);
}
}
});
}
/**
* 輸入框內(nèi)容回調(diào),當(dāng)輸入框內(nèi)容改變時(shí)會(huì)觸發(fā)
*/
public interface TextChangeListener {
void textChange(String text);
}
public void setTextChangeListener(TextChangeListener listener) {
this.listener = listener;
}
/**
* 每4位添加一個(gè)空格
*
* @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();
}
/**
* 獲取追加字符前輸入內(nèi)容
* @return
*/
public String getInputText() {
return getText().toString().replaceAll(item, "");
}
}
核心思路是在文本改變時(shí)獲取到原字符串取出每一個(gè)字符添加上要追加的字符后返回字符串并重新setText。當(dāng)然中間會(huì)有一些坑,比如光標(biāo)位置、刪除時(shí)空格要跳過以及刪除后會(huì)再追加空格會(huì)造成死循環(huán)的問題。當(dāng)然這里很多情況已經(jīng)處理過了,如果有其他需求比如手機(jī)號(hào)碼的111 1111 1111的形式可以修改addSpaceByCredit這個(gè)方法。
限制字符
借鑒博客Android EditText限制輸入字符的5種實(shí)現(xiàn)方式
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);
//設(shè)置新的光標(biāo)所在位置
et_traveler_content.setSelection(et_traveler_content.getText().toString().length());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
public String stringFilter(String str) {
// 只允許字母、數(shù)字、英文空白字符
String regEx = "[^a-zA-Z0-9\\s]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return m.replaceAll("");
}
這里也是輸入時(shí)做過濾然后重新setText。只要需要對(duì)正則表達(dá)式熟悉想做什么限制都可以。
MD效果
系統(tǒng)自帶
<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包裹一層便可以實(shí)現(xiàn)MD效果。
常用屬性
1.明文、密文
if (isShowPwd) {
// 可視密碼輸入
setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo
.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
} else {
// 非可視密碼狀態(tài)
setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
}
2.默認(rèn)不獲取焦點(diǎn)
父容器設(shè)置(其實(shí)只要布局內(nèi)有一個(gè)控件設(shè)置就可以)
android:focusableInTouchMode="true"
一些第三方庫



總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- Android 登錄頁面的實(shí)現(xiàn)代碼(密碼顯示隱藏、EditText 圖標(biāo)切換、限制輸入長(zhǎng)度)
- Android EditText隨輸入法一起移動(dòng)并懸浮在輸入法之上的示例代碼
- Android EditText每4位自動(dòng)添加空格效果
- Android EditText長(zhǎng)按菜單中分享功能的隱藏方法
- Android中多個(gè)EditText輸入效果的解決方式
- Android實(shí)現(xiàn)微信朋友圈評(píng)論EditText效果
- Android EditText監(jiān)聽回車鍵并處理兩次回調(diào)問題
- Android實(shí)現(xiàn)EditText添加下劃線
- Android自定義密碼輸入EditTextLayout
- Android EditText限制輸入整數(shù)和小數(shù)的位數(shù)的方法示例
- Android使用EditText小技巧匯總
相關(guān)文章
Android實(shí)現(xiàn)基本功能的新聞應(yīng)用
這篇文章主要介紹了一個(gè)簡(jiǎn)易功能的Android新聞應(yīng)用實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12
Android開發(fā)之圖片壓縮工具類完整實(shí)例
這篇文章主要介紹了Android開發(fā)之圖片壓縮工具類,結(jié)合完整實(shí)例形式分析了Android針對(duì)圖片壓縮的相關(guān)屬性設(shè)置與轉(zhuǎn)換操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-11-11
Android Studio3.6.+ 插件搜索不到終極解決方案(圖文詳解)
這篇文章主要介紹了Android Studio3.6.+ 插件搜索不到終極解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
Android基于Toolbar實(shí)現(xiàn)頂部標(biāo)題欄及后退鍵
這篇文章主要介紹了Android基于Toolbar實(shí)現(xiàn)頂部標(biāo)題欄及后退鍵,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Android自定義Dialog內(nèi)部透明、外部遮罩效果
這篇文章主要為大家詳細(xì)介紹了Android自定義Dialog內(nèi)部透明、外部遮罩效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
android編程實(shí)現(xiàn)的自定義注釋模板實(shí)例
這篇文章主要介紹了android編程實(shí)現(xiàn)的自定義注釋模板,以完整實(shí)例形式分析了Android自定義魔板的定義及具體實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2015-11-11
Android使用IntentService進(jìn)行apk更新示例代碼
這篇文章主要介紹了Android使用IntentService進(jìn)行apk更新示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
Android中應(yīng)用前后臺(tái)切換監(jiān)聽的實(shí)現(xiàn)詳解
這篇文章主要給大家介紹了關(guān)于Android中應(yīng)用前后臺(tái)切換監(jiān)聽實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07

