最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年06月12日 09:51:37   作者:denko  
這篇文章主要給大家介紹了關(guān)于Android EditText追加空格、限制字符等的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

使用輸入框時(shí)產(chǎn)品常常會(huì)有一些需求,比如123456789變成123-456-789或者限制一些字符的輸入等等。很多時(shí)候都是網(wǎng)上搜索就完事了,但是每次都去搜索有點(diǎn)浪費(fèi)時(shí)間,而且有些也不符合需求。所以自己寫一篇,以后就可以吃老本了。😝

追加字符

借鑒博客EditText每4位自動(dòng)添加空格

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"

一些第三方庫

MaterialEditText

 Masked-Edittext

XEditText

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Android實(shí)現(xiàn)基本功能的新聞應(yīng)用

    Android實(shí)現(xiàn)基本功能的新聞應(yīng)用

    這篇文章主要介紹了一個(gè)簡易功能的Android新聞應(yīng)用實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12
  • Android啟動(dòng)相機(jī)拍照并返回圖片

    Android啟動(dòng)相機(jī)拍照并返回圖片

    Android啟動(dòng)相機(jī)拍照并返回圖片,事先定義拍照方法,在啟動(dòng)拍照之前先判斷內(nèi)存是否可用,通過重寫onactivityresult()方法,獲取拍好的圖片。對(duì)下文感興趣的朋友可以參考下
    2015-10-10
  • Android開發(fā)之圖片壓縮工具類完整實(shí)例

    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.+ 插件搜索不到終極解決方案(圖文詳解)

    這篇文章主要介紹了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)題欄及后退鍵

    這篇文章主要介紹了Android基于Toolbar實(shí)現(xiàn)頂部標(biāo)題欄及后退鍵,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Android自定義Dialog內(nèi)部透明、外部遮罩效果

    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)的自定義注釋模板,以完整實(shí)例形式分析了Android自定義魔板的定義及具體實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2015-11-11
  • Android之Gallery使用例子

    Android之Gallery使用例子

    本篇文章主要介紹了Android之Gallery使用例子,Gallery用來顯示圖片列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Android使用IntentService進(jìn)行apk更新示例代碼

    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)詳解

    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

最新評(píng)論

伊金霍洛旗| 项城市| 永胜县| 开化县| 商洛市| 花莲市| 扎兰屯市| 大余县| 屏南县| 鹿泉市| 海门市| 锡林浩特市| 庆城县| 临邑县| 蓝山县| 勐海县| 霍城县| 沾益县| 西和县| 绿春县| 武山县| 临泽县| 曲靖市| 纳雍县| 黄山市| 虹口区| 克拉玛依市| 花莲县| 仙桃市| 丰镇市| 靖远县| 木里| 广南县| 铜山县| 贵德县| 安远县| 武义县| 栾川县| 霍山县| 金沙县| 龙井市|