实现EditText的分割输入内容效果

 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(context, attrs);
  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);
 }
 /**
  * 设置焦点
  * 
  * @param text
  */
 private void mySetSelection() {
  mySetSelection(fullSelection());
 }
 /**
  * 设置焦点
  * 
  * @param text
  */
 private void mySetSelection(int index) {
  DivisionEditText.this.setSelection(index);
 }
 /**
  * 从光标位置起始,检查后面是否还有空的占位符
  * 
  * @param text
  * @param selection
  * @return
  */
 private int isBlank(int selection) {
  int index = -1;
  for (int i = selection - 1; i < length; i++) {
   if (placeHolder.equals(text[i])) {
    index = i;
    break;
   }
  }
  return index;
 }
 /**
  * 最后一个不空的字符后的光标位置
  * 
  * @param text
  * @return
  */
 private int fullSelection() {
  int index = 0;
  for (int i = 0; i < length; i++) {
   if (!placeHolder.equals(text[i]) && !delimiter.equals(text[i])) {
    index = i + 1;
   }
  }
  return index;
 }
 public Integer getTotalLength() {
  return totalLength;
 }
 public void setTotalLength(Integer totalLength) {
  this.totalLength = totalLength;
 }
 public Integer getEachLength() {
  return eachLength;
 }
 public void setEachLength(Integer eachLength) {
  this.eachLength = eachLength;
 }
 public String getDelimiter() {
  return delimiter;
 }
 public void setDelimiter(String delimiter) {
  this.delimiter = delimiter;
 }
 public String getPlaceHolder() {
  return placeHolder;
 }
 public void setPlaceHolder(String placeHolder) {
  this.placeHolder = placeHolder;
 }
}

attrs.xml

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="EditText">
        <!-- 总共输入长度 -->
        <attr name="totalLength" format="integer" />
        <!-- 每组的长度 -->
        <attr name="eachLength" format="integer" />
        <!-- 分隔符 -->
        <attr name="delimiter" format="string" />
        <!-- 占位符 -->
        <attr name="placeHolder" format="string" />
    </declare-styleable>
</resources>

在布局文件中使用

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:fsms="http://schemas.android.com/apk/res/com.example.sequencenumber"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <com.example.sequencenumber.DivisionEditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        fsms:delimiter="-"
        fsms:eachLength="5"
        fsms:placeHolder="0"
        fsms:totalLength="25" />
</LinearLayout>
时间: 2024-11-03 13:51:49

实现EditText的分割输入内容效果的相关文章

EditText 使用细节(输入内容改变时的监听事件、透明背景、修改提示文字颜色、输入内容密文显示)

1.对EditText的输入内容进行监听,给EditText 绑定 addTextChangedListener 监听事件 即可. 2.EditText输入内容,密文显示: android:password="true" 3.将EditText边框设置成透明的: android:background="#00000000" 4.修改EditText中hint文字颜色: android:textColorHint="#ffffff" 很多时候,我们

JS中同步显示并分割输入的数字字符串

题目比较晦涩,来张图来说明要表达的效果: 第一张图的效果就是,用户输入一个数字,上面就显示一个大层,然后显示输入的数字,并把数字用空格按照每四位分割出来.好像在建行的网上银行上面就有这种效果.第二个图的效果就是用户在一个文本框中输入一串数字,然后再光标离开的时候,把数字按照每三位用逗号给分割开来,类似于老外的金钱输入效果. 效果一 同步显示分割分割输入 这种效果中,仿造的就是输入银行卡子类的,故只能够输入数字,需要禁用用户输入的其它字符下面是几种实现方式.先贴上HTML和CSS代码: 1 <ht

备忘: Android中把EditText的输入内容转为大写

editText_SerialCode = (EditText) findViewById(R.id.editText_SerialCode); editText_SerialCode.addTextChangedListener(textWatcher); private TextWatcher textWatcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int

Android 开发之拦截EditText的输入内容,定制输入内容

1.EditText作为一个比较成熟的View,在Android的应用开发中得到极为广泛的使用.在某些特殊情况下,我们可能需要定制EditText的输入内容, 只允许指定功能的输入,例如输入一个”ddd:mm:ssssss“格式的度分秒角度. 一些错误的思路有: (1)OnKeyListener,实现EditText的OnKeyListener并不能拦截EditText的输入,OnKeyListener只能够监听到一些按物理键事件,例如菜单键.返回键.音量键等, 而输入法作为一个单独的进程,Ed

android EditText如何使光标随着输入内容移动

EditText 使光标随着输入内容移动的setSelection()

文本框输入内容智能提示效果

实现效果如图 大体思路: 1.监听文本框事件.这里是用的keyup事件.大家可以尝试用onchange事件.不过感觉keyup事件的效果要好一点. 2.根据输入内容通过ajax异步的方式去访问后台数据. 3.遍历返回数据将数据添加到显示区域. 4.在添加数据的同时给每一条数据加上一些效果,点击其中一条将数据填到文本框,并且提示内容消失. 5.后台数据应该拼接成json格式.我这里的格式是这样的[{"name":"张三","sex","男

[Android] AutoCompleteTextView:自动完成输入内容的控件(自动补全)

AutoCompleteTextView是EditText的直接子类,与普通EditText的最大不同就是,在用户输入的过程中,可以列出可供选择的输入项,方便使用者. AutoCompleteTextView与普通EditText控件使用方法类似,只是需要为其指定一个Adapter对象,绑定可供选择的输入项. AutoCompleteTextView可实现一次自动完成的功能,而另一个控件MultiAutoCompleteTextView,可以连续多次自动完成,即在通过自动完成一个输入项,接着输入

在EditText中限制输入,自定义样式,监听输入的字符,自动换行

自动获取焦点 <!-- 添加:<requestFocus /> 会自动获取焦点 --> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:gravity="center_horizontal" android:hint="自

实现文本框输入内容提示代码实例

实现文本框输入内容提示代码实例:比较人性化的网站一般都是比较讲究细节的,比如文本框输入内容具有提示效果,在默认情况下,文本框有提示文本,当鼠标放入文本框输入文本的时候,提示文本会消失,下面就通过代码实例介绍一下如何实现此效果.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="ht