文档章节

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

 易水寒521
发布于 2015/06/23 16:39
字数 861
阅读 344
收藏 7
点赞 0
评论 0
 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>

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 129
码字总数 120077
作品 0
虹口
EditText输入电话号码、银行卡号自动添加空格分割

功能介绍: ①EditText输入电话号码、银行卡号自动添加空格分割 ②自定义分割符号、分割模式 ③右侧默认添加清除功能图标,可自定义图标并设置点击监听,配合PopupWindow等进行输入提示 ④仿...

拼一把 ⋅ 2015/11/26 ⋅ 0

急!android的notifydatasetchanged第二次查询没反应的问题。

这个问题郁闷我接近两天了,很郁闷,求大神帮忙。 截图如下 实现效果是listview外加一个edittext在最上面,editText.addTextChangedListener(new TextWatcher() {};adapter实现了filterable接...

happycodinggirl ⋅ 2013/05/21 ⋅ 0

Android开发之EditText属性详解

1、EditText输入的文字为密码形式的设置 (1)通过.xml里设置: 把该EditText设为:android:password="true" // 以”.”形式显示文本 (2)在代码里设置: 通过设置EditText的setTransformation...

的书法上的 ⋅ 2014/07/28 ⋅ 0

学习笔记-Android之ListView随EditText输入内容动态改变

在学习过程之中经常用到各种词典发现再输入过程中有类似AutocompleteTextView的随着在EditText输入内容ListView动态变化的效果 自己试着简单实现以下 实现这种效果主要用到的一个类TextWatch...

WonderfulLife ⋅ 2012/09/12 ⋅ 2

安卓开发之自定义控件实现MaterialEditText

按照常规先展示效果图并说明: 主要有以下几个效果: edittext中的内容为0时,标签不出现 edittext中的内容不为0时,标签开始出现 edittext获取焦点时,下划线的颜色/粗细会发生改变 editte...

cxmscb ⋅ 2016/10/13 ⋅ 0

EditText的一些常用功能的介绍

一:新建HelloEditText工程 新建一个Hello world详细步骤可以参见 Android教程之三:第一个Android应用,HelloWorld 创建设置如下: Project name: HelloEditText Build Target :android 2....

yuwentao ⋅ 2012/04/19 ⋅ 0

android开发中TextInputLayout使用方法

android开发中TextInputLayout使用方法,TextInputLayout其实是一个容器,他继承自LinearLayout,该容器是作用于TextView的,TextInputLayout只能包裹一个子节点,类似于ScrollView。 本文以...

android开发 ⋅ 2017/12/13 ⋅ 0

Android 重写EditText自定义密码输入框

首先看看效果 如上图的密码输入框,没有密码时,有几个密码就有几条下划线,输入密码后显示的内容为“”,并且底部就没有下划线了,同样有很多方式实现,这里就偷懒改改EditText来实现,所以...

yaly ⋅ 2016/12/15 ⋅ 0

android有用代码片段 1

一、 获取系统版本号: PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0); int versionCode=nfo.versionCode string versionName=info.versionNam 二......

九洲北研 ⋅ 2013/01/24 ⋅ 2

【android基础学习之三】——基础控件Toast,EditText,RadioGroup,RadioButton

声明:学习的书籍《Android应用开发揭秘》,这里记录学习该书籍的日志,引用的相关代码与总结描述,没有商业的用途,完全是自我学习的一个记录,刚刚学习不可避免会出现很多问题,若是有错误...

晨曦之光 ⋅ 2012/03/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 26分钟前 ⋅ 0

Spring JavaConfig 注解

JavaConfig注解允许开发者将Bean的定义和配置放在Java类中。它是除使用XML文件定义和配置Bean外的另一种方案。 配置: 如一个Bean如果在XML文件可以这样配置: <bean id="helloBean" class="...

霍淇滨 ⋅ 33分钟前 ⋅ 0

Spring clound 组件

Spring Cloud技术应用从场景上可以分为两大类:润物无声类和独挑大梁类。 润物无声,融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon,客户端负载均衡,特性有区域亲和、重试机制。...

英雄有梦没死就别停 ⋅ 35分钟前 ⋅ 0

Confluence 6 重新获得站点备份文件

Confluence 将会创建备份,同时压缩 XML 文件后存储熬你的 <home-directory>/backups> 目录中。你需要自己访问你安装的 Confluence 服务器,并且从服务器上获得这个文件。 运行从 Confluence...

honeymose ⋅ 39分钟前 ⋅ 0

informix的常用SQL语句

1、创建数据库 eg1. 创建不记录日志的库testdb,参考语句如下: CREATE DATABASE testdb; eg2. 创建带缓冲式的记录日志的数据库testdb(SQL语句不一定在事务之中,拥有者名字不被用于对象的解...

wangxuwei ⋅ 55分钟前 ⋅ 0

matplotlib画图

最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数。 from pylab import *from numpy import *x = linspace(0, 5, 10)y = x ** 2figure()plot(x, y, 'r')...

Dr_hu ⋅ 今天 ⋅ 0

RabbitMQ学习以及与Spring的集成(三)

本文介绍RabbitMQ与Spring的简单集成以及消息的发送和接收。 在RabbitMQ的Spring配置文件中,首先需要增加命名空间。 xmlns:rabbit="http://www.springframework.org/schema/rabbit" 其次是模...

onedotdot ⋅ 今天 ⋅ 0

JAVA实现仿微信红包分配规则

最近过年发红包拜年成为一种新的潮流,作为程序猿对算法的好奇远远要大于对红包的好奇,这里介绍一种自己想到的一种随机红包分配策略,还请大家多多指教。 算法介绍 一、红包金额限制 对于微...

小致dad ⋅ 今天 ⋅ 0

Python 数电表格格式化 xlutils xlwt xlrd的使用

需要安装 xlutils xlwt xlrd 格式化前 格式化后 代码 先copy读取的表格,然后按照一定的规则修改,将昵称中的学号提取出来替换昵称即可 from xlrd import open_workbookfrom xlutils.copy ...

阿豪boy ⋅ 今天 ⋅ 0

面试题:使用rand5()生成rand7()

前言 读研究生这3 年,思维与本科相比变化挺大的,这几年除了看论文、设计方案,更重要的是学会注重先思考、再实现,感觉更加成熟吧,不再像个小P孩,人年轻时总会心高气傲。有1 道面试题:给...

初雪之音 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部