Android自定義EditText,實現分割輸入內容效果
Android中沒有發現類似的空間,只好自己動手了。
1.首先自定義控制元件繼承EditText,實現相應方法。
Java程式碼
- package com.example.sequencenumber;
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.text.Editable;
- import android.text.TextWatcher;
-
import android.util.AttributeSet;
- import android.view.View;
- import android.widget.EditText;
- /**
- * 分割輸入框
- *
- * @author Administrator
- *
- */
- public class DivisionEditText extends EditText {
- /* 內容陣列 */
- private String[] text;
- /* 陣列實際長度 (內容+分隔符) */
- private Integer length;
- /* 允許輸入的長度 */
-
private Integer totalLength;
- /* 每組的長度 */
- private Integer eachLength;
- /* 分隔符 */
- private String delimiter;
- /* 佔位符 */
- private String placeHolder;
- public DivisionEditText(Context context) {
- super(context);
- }
- public DivisionEditText(Context context, AttributeSet attrs) {
-
super
- try {
- // 初始化屬性
- TypedArray typedArray = context.obtainStyledAttributes(attrs,
- R.styleable.EditText);
- this.totalLength = typedArray.getInteger(
- R.styleable.EditText_totalLength, 0);
- this.eachLength = typedArray.getInteger(
- R.styleable.EditText_eachLength, 0);
- this.delimiter = typedArray
- .getString(R.styleable.EditText_delimiter);
- if (this.delimiter == null || this.delimiter.length() == 0) {
- this.delimiter = "-";
- }
- this.placeHolder = typedArray
- .getString(R.styleable.EditText_placeHolder);
- if (this.placeHolder == null || this.placeHolder.length() == 0) {
- this.placeHolder = " ";
- }
- typedArray.recycle();
- // 初始化
- init();
- // 內容變化監聽
- this.addTextChangedListener(new DivisionTextWatcher());
- // 獲取焦點監聽
- this.setOnFocusChangeListener(new DivisionFocusChangeListener());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public DivisionEditText(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- /**
- * 初始化
- */
- public void init() {
- // 總共分幾組
- int groupNum = 0;
- // 如果每組長度(除數)不為0,計算
- if (this.eachLength != 0) {
- groupNum = this.totalLength / this.eachLength;
- }
- // 實際長度
- length = this.totalLength + this.eachLength != 0 ? this.totalLength
- + groupNum - 1 : 0;
- // 初始化陣列
- text = new String[this.length];
- // 如果陣列大小大於0,初始化裡面內容
- // 空格佔位,分隔符佔位
- if (length > 0) {
- for (int i = 0; i < length; i++) {
- if (i != 0 && (i + 1) % (this.eachLength + 1) == 0) {
- text[i] = this.delimiter;
- } else {
- text[i] = placeHolder;
- }
- }
- // 設定文字
- mySetText();
- // 設定焦點
- mySetSelection();
- }
- }
- /**
- * 獲取結果
- *
- * @return
- */
- public String getResult() {
- StringBuffer buffer = new StringBuffer();
- for (String item : text) {
- if (!placeHolder.equals(item) && !delimiter.equals(item)) {
- buffer.append(item);
- }
- }
- return buffer.toString();
- }
- /**
- * 文字監聽
- *
- * @author Administrator
- *
- */
- private class DivisionTextWatcher implements TextWatcher {
- @Override
- public void afterTextChanged(Editable s) {
- }
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
- @Override
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
- // 如果當前長度小於陣列長度,認為使用退格
- if (s.length() < length) {
- // 游標所在位置
- int index = DivisionEditText.this.getSelectionStart();
- // 刪除的字元
- String deleteStr = text[index];
- // 如果是分隔符,刪除分隔符前一個
- if (delimiter.equals(deleteStr)) {
- index--;
- }
- // 置空
- text[index] = placeHolder;
- // 檢視前一個是否為分隔符
- if (index - 1 >= 0) {
- if (delimiter.equals(text[index - 1])) {
- index--;
- }
- }
- // 設定文字
- mySetText();
- // 設定焦點
- mySetSelection(index);
- }
- // 只能一個一個字元輸入
- if (count == 1) {
- // 從游標起始,是否還有空的位置
- int index = isBlank(DivisionEditText.this.getSelectionStart());
- // 如果還有
- if (index != -1) {
- // 輸入框內的字串
- String allStr = s.toString();
- // 輸入的字串
- String inputStr = allStr.substring(start, start + count);
- // 替換佔位符
- text[index] = inputStr;
- }
- // 設定文字
- mySetText();
- // 設定焦點
- mySetSelection();
- }
- }
- }
- /**
- * 獲取焦點監聽
- *
- * @author Administrator
- *
- */
- private class DivisionFocusChangeListener implements OnFocusChangeListener {
- @Override
- public void onFocusChange(View v, boolean hasFocus) {
- if (hasFocus) {
- // 設定焦點
- mySetSelection(0);
- }
- }
- }
- /**
- * 設定文字
- *
- * @param text
- */
- private void mySetText() {
- StringBuffer buffer = new StringBuffer();
- for (String item : text) {
- buffer.append(item);
- }
- // 設定文字
- setText(buffer);
- }
- /**
- * 設定焦點
-
相關推薦
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程式碼