1. 程式人生 > >Android自定義EditText,實現分割輸入內容效果

Android自定義EditText,實現分割輸入內容效果

例如,輸入一組25位的序列號,希望分成5組,每組5個數字。效果如下圖。 


Android中沒有發現類似的空間,只好自己動手了。 

1.首先自定義控制元件繼承EditText,實現相應方法。 
Java程式碼  收藏程式碼
  1. package com.example.sequencenumber;  
  2. import android.content.Context;  
  3. import android.content.res.TypedArray;  
  4. import android.text.Editable;  
  5. import android.text.TextWatcher;  
  6. import android.util.AttributeSet;  
  7. import android.view.View;  
  8. import android.widget.EditText;  
  9. /** 
  10.  * 分割輸入框 
  11.  *  
  12.  * @author Administrator 
  13.  *  
  14.  */  
  15. public class DivisionEditText extends EditText {  
  16.     /* 內容陣列 */  
  17.     private String[] text;  
  18.     /* 陣列實際長度 (內容+分隔符) */  
  19.     private Integer length;  
  20.     /* 允許輸入的長度 */  
  21.     private Integer totalLength;  
  22.     /* 每組的長度 */  
  23.     private Integer eachLength;  
  24.     /* 分隔符 */  
  25.     private String delimiter;  
  26.     /* 佔位符 */  
  27.     private String placeHolder;  
  28.     public DivisionEditText(Context context) {  
  29.         super(context);  
  30.     }  
  31.     public DivisionEditText(Context context, AttributeSet attrs) {  
  32.         super
    (context, attrs);  
  33.         try {  
  34.             // 初始化屬性  
  35.             TypedArray typedArray = context.obtainStyledAttributes(attrs,  
  36.                     R.styleable.EditText);  
  37.             this.totalLength = typedArray.getInteger(  
  38.                     R.styleable.EditText_totalLength, 0);  
  39.             this.eachLength = typedArray.getInteger(  
  40.                     R.styleable.EditText_eachLength, 0);  
  41.             this.delimiter = typedArray  
  42.                     .getString(R.styleable.EditText_delimiter);  
  43.             if (this.delimiter == null || this.delimiter.length() == 0) {  
  44.                 this.delimiter = "-";  
  45.             }  
  46.             this.placeHolder = typedArray  
  47.                     .getString(R.styleable.EditText_placeHolder);  
  48.             if (this.placeHolder == null || this.placeHolder.length() == 0) {  
  49.                 this.placeHolder = " ";  
  50.             }  
  51.             typedArray.recycle();  
  52.             // 初始化  
  53.             init();  
  54.             // 內容變化監聽  
  55.             this.addTextChangedListener(new DivisionTextWatcher());  
  56.             // 獲取焦點監聽  
  57.             this.setOnFocusChangeListener(new DivisionFocusChangeListener());  
  58.         } catch (Exception e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.     }  
  62.     public DivisionEditText(Context context, AttributeSet attrs, int defStyle) {  
  63.         super(context, attrs, defStyle);  
  64.     }  
  65.     /** 
  66.      * 初始化 
  67.      */  
  68.     public void init() {  
  69.         // 總共分幾組  
  70.         int groupNum = 0;  
  71.         // 如果每組長度(除數)不為0,計算  
  72.         if (this.eachLength != 0) {  
  73.             groupNum = this.totalLength / this.eachLength;  
  74.         }  
  75.         // 實際長度  
  76.         length = this.totalLength + this.eachLength != 0 ? this.totalLength  
  77.                 + groupNum - 1 : 0;  
  78.         // 初始化陣列  
  79.         text = new String[this.length];  
  80.         // 如果陣列大小大於0,初始化裡面內容  
  81.         // 空格佔位,分隔符佔位  
  82.         if (length > 0) {  
  83.             for (int i = 0; i < length; i++) {  
  84.                 if (i != 0 && (i + 1) % (this.eachLength + 1) == 0) {  
  85.                     text[i] = this.delimiter;  
  86.                 } else {  
  87.                     text[i] = placeHolder;  
  88.                 }  
  89.             }  
  90.             // 設定文字  
  91.             mySetText();  
  92.             // 設定焦點  
  93.             mySetSelection();  
  94.         }  
  95.     }  
  96.     /** 
  97.      * 獲取結果 
  98.      *  
  99.      * @return 
  100.      */  
  101.     public String getResult() {  
  102.         StringBuffer buffer = new StringBuffer();  
  103.         for (String item : text) {  
  104.             if (!placeHolder.equals(item) && !delimiter.equals(item)) {  
  105.                 buffer.append(item);  
  106.             }  
  107.         }  
  108.         return buffer.toString();  
  109.     }  
  110.     /** 
  111.      * 文字監聽 
  112.      *  
  113.      * @author Administrator 
  114.      *  
  115.      */  
  116.     private class DivisionTextWatcher implements TextWatcher {  
  117.         @Override  
  118.         public void afterTextChanged(Editable s) {  
  119.         }  
  120.         @Override  
  121.         public void beforeTextChanged(CharSequence s, int start, int count,  
  122.                 int after) {  
  123.         }  
  124.         @Override  
  125.         public void onTextChanged(CharSequence s, int start, int before,  
  126.                 int count) {  
  127.             // 如果當前長度小於陣列長度,認為使用退格  
  128.             if (s.length() < length) {  
  129.                 // 游標所在位置  
  130.                 int index = DivisionEditText.this.getSelectionStart();  
  131.                 // 刪除的字元  
  132.                 String deleteStr = text[index];  
  133.                 // 如果是分隔符,刪除分隔符前一個  
  134.                 if (delimiter.equals(deleteStr)) {  
  135.                     index--;  
  136.                 }  
  137.                 // 置空  
  138.                 text[index] = placeHolder;  
  139.                 // 檢視前一個是否為分隔符  
  140.                 if (index - 1 >= 0) {  
  141.                     if (delimiter.equals(text[index - 1])) {  
  142.                         index--;  
  143.                     }  
  144.                 }  
  145.                 // 設定文字  
  146.                 mySetText();  
  147.                 // 設定焦點  
  148.                 mySetSelection(index);  
  149.             }  
  150.             // 只能一個一個字元輸入  
  151.             if (count == 1) {  
  152.                 // 從游標起始,是否還有空的位置  
  153.                 int index = isBlank(DivisionEditText.this.getSelectionStart());  
  154.                 // 如果還有  
  155.                 if (index != -1) {  
  156.                     // 輸入框內的字串  
  157.                     String allStr = s.toString();  
  158.                     // 輸入的字串  
  159.                     String inputStr = allStr.substring(start, start + count);  
  160.                     // 替換佔位符  
  161.                     text[index] = inputStr;  
  162.                 }  
  163.                 // 設定文字  
  164.                 mySetText();  
  165.                 // 設定焦點  
  166.                 mySetSelection();  
  167.             }  
  168.         }  
  169.     }  
  170.     /** 
  171.      * 獲取焦點監聽 
  172.      *  
  173.      * @author Administrator 
  174.      *  
  175.      */  
  176.     private class DivisionFocusChangeListener implements OnFocusChangeListener {  
  177.         @Override  
  178.         public void onFocusChange(View v, boolean hasFocus) {  
  179.             if (hasFocus) {  
  180.                 // 設定焦點  
  181.                 mySetSelection(0);  
  182.             }  
  183.         }  
  184.     }  
  185.     /** 
  186.      * 設定文字 
  187.      *  
  188.      * @param text 
  189.      */  
  190.     private void mySetText() {  
  191.         StringBuffer buffer = new StringBuffer();  
  192.         for (String item : text) {  
  193.             buffer.append(item);  
  194.         }  
  195.         // 設定文字  
  196.         setText(buffer);  
  197.     }  
  198.     /** 
  199.      * 設定焦點 
  200. 相關推薦

    Android定義EditText實現分割輸入內容效果

    例如,輸入一組25位的序列號,希望分成5組,每組5個數字。效果如下圖。 Android中沒有發現類似的空間,只好自己動手了。 1.首先自定義控制元件繼承EditText,實現相應方法。  Java程式碼   package com.example.sequencenu

    Android 定義View實現折線圖

    最近要完成一個折線圖控制元件,用來顯示一系列的狀態,並可以進行滑動。雖然現在有很多大牛寫好的控制元件可以直接使用,但我感覺那些控制元件是給高手的使用的,對於我這樣的菜鳥,還是腳踏實地,自己慢慢碼程式碼,才可以提高。下面就是結果圖(每種狀態用一個表情圖片表示): 1 主頁

    Android定義View實現全屏滑動的DrawerLayout

        對與DrawerLayout大家應該用過,是Google官方推出的一種抽屜式導航控制元件。開啟左右兩邊選單的方式是從手機屏 幕的邊緣處滑動來觸發,不過總有些**的需求要讓它可以全屏滑動觸發選單,網上也有一些解決辦法,無非就是用 setDrawerLeftE

    Android 定義跑馬燈 實現超長文字滾動完當前在繼續切換下一條

    1 前言 最近專案上有一個跑馬燈的需求。 需求: 無限滾動,可以自動切換下一條 如果當前的文字超過一屏,則滾動完當前再切換下一條 第一點很簡單,但是第二點就比較蛋疼了,看了網上很多輪子都沒有太合適的,於是自己寫了一個。 記錄總結一下Android 跑馬燈的

    Android定義View的實現方法帶你一步步深入瞭解View(四)

    不知不覺中,帶你一步步深入瞭解View系列的文章已經寫到第四篇了,回顧一下,我們一共學習了LayoutInflater的原理分析、檢視的繪製流程、檢視的狀態及重繪等知識,算是把View中很多重要的知識點都涉及到了。如果你還沒有看過我前面的幾篇文章,建議先去閱讀一下,多瞭解一些

    Android定義EditText——帶一鍵清除和密碼明文切換按鈕支援多樣式選擇

          Android自定義View開始入坑,打算寫一些自定義控制元件練練手。       這是一個自定義EditText,帶一鍵清除和密碼明文切換按鈕(可以傳入自定義圖片資源),可以自定義邊框顏色,還支援四種邊框樣式的選擇。       原始碼已上傳 GitHub: 

    Android定義控制元件】選擇輸入框的實現

    1.場景 Android開發中經常會用到選擇輸入控制元件,比如性別的輸入 2.示例圖片 3.程式碼組成 1)演示用的主介面佈局不多說,這裡採用EditText + 一個自定義的底部列表對話方塊來實現的 2)佈局檔案 <?xml

    android framework新增定義服務實現java層api呼叫

    1.在frameworks/base/core/java/android/app/下新增aidl檔案 frameworks/base/core/java/android/app/IGMyTestService.aidl package android.app; // De

    Android定義控制元件】密碼輸入框+數字鍵盤的實現

    因專案需要,實現了一個自定義的密輸入框和自定義數字鍵盤,用作使用者支付密碼設定介面。先上效果圖如下,方格樣式,以及點選空白處隱藏軟鍵盤。 控制元件實現清單: 1)集成於EditText的輸入框控制元件:PasswordInputView.java 2)

    Android定義控制元件之定義TextView實現drawableLeft可以和文字一起居中

    LZ-Says:給大家推薦一個網站,有興趣可以查閱,想為大家貢獻一點自己的力量也可以投稿,老大稽核通過會發表,更好的幫助有需要的人~歡迎大家踴躍投稿~地址如下: http://ww

    Android定義dialog並實現失去焦點activity獲取焦點的功能

    前言:由於在專案中需要用到更新顯示動畫的需求,所以想到了dialog,自定義dialog不難,網上教程很多,但是在實現dialog背景透明的需求時,遇到了一點問題,網上的一些方法在我的機器上並沒有實現,只能曲折中找到了另一個方法實現。雖然有點麻煩,但畢竟效果不錯。 此方

    android 定義dialog的實現方法

    listener params .get animator miss nim style wrap 參數 最近一直在做 java 相關的東西, 雖然一直在看 Android 但感覺有點留於理論,總這樣畢竟不行,寫的多不一定懂得多,但要想懂得多就一定要寫的多,於是今天動手寫了

    定義SeekBar實現帶刻度的進度條實現顏色漸變效果

    自定義SeekBar, 進度變化由視覺化氣泡樣式呈現,定製化程度較高 實現帶刻度的進度條實現顏色漸變效果 Github太慢,所以只在碼雲上持續更新 整體效果如下: 主要程式碼 1.attr中

    Android定義View的實現方法 帶你一步步深入瞭解View 四

                    不知不覺中,帶你一步步深入瞭解View系列的文章已經寫到第四篇了,回顧一下,我們一共學習了LayoutInflater的原理分析、檢視的繪製流程、檢視的狀態及重繪等知識,算是把View中很多重要的知識點都涉及到了。如果你還沒有看過我前面的幾篇文章,建議先去閱讀一下,多瞭解一些原

    Android定義View繪圖實現拖影動畫

    前幾天在“Android繪圖之漸隱動畫”一文中通過畫線實現了漸隱動畫,但裡面有個問題,畫筆較粗(大於1)時線段之間會有裂隙,我又改進了一下。這次效果好多了。 先看效果吧: 然後我們來說說基本的做法: 根據畫筆寬度,計算每一條線段兩個頂點對應的四個點,

    我的Android進階之旅------>Android定義View來實現解析lrc歌詞並同步滾動、上下拖動、縮放歌詞的功能

    前言 最近有個專案有關於播放音樂時候,關於歌詞有以下幾個功能: 1、實現歌詞同步滾動的功能,即歌曲播放到哪句歌詞,就高亮地顯示出正在播放的這個歌詞; 2、實現上下拖動歌詞時候,可以拖動播放器的進度。即可以不停地上下拖動歌詞,

    android 定義view在xml中引用內部類View

    java.lang.ClassCastException: android.view.View cannot be cast to com.voice.VoiceFragment$AnimationView E/AndroidRuntime( 3543): at com.voice.VoiceFragme

    Android定義view之實現帶checkbox的Snackbar

    前言 最近專案要求實現一個類似於snackbar功能,但是又不完全是snackbar的外掛,本來想在Google提供的snackbar裡面進行更改,但是這樣太麻煩了,於是自己動手實現了一個snackbar。先看下效果圖: 1.要解決的問題 1.彈框裡面除了文字提示之外還有一個按鈕,這個按

    Android 定義CheckAnimView支付寶支付成功打勾對號動畫kotlin編寫

    CheckAnimView是什麼東西呢,顧名思義就是選擇器,帶動畫效果的View,此View全由程式碼生成圖形。 使用場景:1、可以當作酷炫的選擇器。2、也可以用於展示結果,比如:支付結果,操作成功等 接下來看一下效果:  控制元件由四種圖形組合成動畫:邊框(空心圓

    input type=“range”滑塊定義樣式實現步驟詳解及實際應用

    寫在前面: 本文的主要內容包括:type="range"屬性介紹,修改range預設css樣式以及在js中的實際應用。本文面向前端小白,寫的不好之處,請多多見諒。文末有demo連結,可以自行復制到本地進行試驗。 最終要實現的效果: 其中包括一部分js程式碼