您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在Android中使用EditText追加空格,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。
追加字符
借鑒博客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:自動添加占位符的輸入框 */ 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"
看完上述內容,你們對怎么在Android中使用EditText追加空格有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。