android AutoCompleteTextView 实现手机号格式化,附带清空历史的操作
有个小伙伴遇到了这样一个问题,就是AutoCompleteTextView实现自动填充的功能。同时要具备手机格式化的功能。下拉列表最后一行是有个清除历史的功能。可是点击“清除历史”却把文字要设置进去AutoCompleteTextView中。这样的效果显然很糟糕。所以我就写了这样一个简单的demo。来帮助遇到这种问题的朋友解决这样一个问题。二话不多说直接上代码。


布局文件(activity_main.xml)代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Please input:" />
<AutoCompleteTextView
android:id="@+id/actv"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
java文件(MainActivity.java)代码如下:
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.Selection;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private AutoCompleteTextView mAutoCompleteTextView;
private String[] mAutoStrs = new String[] { "138 0013 8000", "13800138001",
"13800138002", "13800138003", "13800138004", "138 0013 800清除记录" };
private String mBeforeTextChangedStr = "";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.actv);
ArrayAdapter<String> _arrayAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line, mAutoStrs);
mAutoCompleteTextView.setAdapter(_arrayAdapter);
mAutoCompleteTextView.setThreshold(1);// 设置输入一个字符就提示
mAutoCompleteTextView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
String _clearStr = "";
if (arg1 instanceof TextView) {
_clearStr = ((TextView) arg1).getText().toString();
}
if (_clearStr.equals("138 0013 800清楚记录")) {
mAutoCompleteTextView.setText(mBeforeTextChangedStr);
Editable _editable = mAutoCompleteTextView.getText();
Selection.setSelection(_editable, _editable.length());
Toast.makeText(MainActivity.this, "清除成功了!",
Toast.LENGTH_LONG).show();
}
}
});
phoneNumAddSpaceOne(mAutoCompleteTextView);
}
/**
* 手机号格式化代码
*
* @param editText
* EditText对象
*/
public void phoneNumAddSpaceOne(final EditText editText) {
editText.addTextChangedListener(new TextWatcher() {
private int start;
private int before;
private StringBuilder stringBuilder;
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
this.start = start;
this.before = before;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
String _str = s.toString();
if (!isNumeric(_str.replace(" ", ""))) {
return;
}
mBeforeTextChangedStr = _str;
// 手机号格式化xxx xxxx xxxx
if (s == null || s.length() == 0)
return;
if (stringBuilder == null) {
stringBuilder = new StringBuilder();
} else {
stringBuilder.delete(0, stringBuilder.length());
}
for (int i = 0; i < s.length(); i++) {
if (i != 3 && i != 8 && s.charAt(i) == ' ') {
continue;
} else {
stringBuilder.append(s.charAt(i));
if ((stringBuilder.length() == 4 || stringBuilder
.length() == 9)&& stringBuilder.charAt(stringBuilder.length() - 1) != ' ') {
stringBuilder.insert(stringBuilder.length() - 1,' ');
}
}
}
if (!stringBuilder.toString().equals(s.toString())) {
int index = start + 1;
if (stringBuilder.charAt(start) == ' ') {
if (before == 0) {
index++;
} else {
index--;
}
} else {
if (before == 1) {
index--;
}
}
editText.setText(stringBuilder.toString());
editText.setSelection(index);
}
}
});
}
/**
* 判断字符串是否是数字
*
* @param str
* 需要判断的字符串
* @return
*/
public boolean isNumeric(String str) {
for (int i = str.length(); --i >= 0;) {
int chr = str.charAt(i);
if (chr < 48 || chr > 57)
return false;
}
return true;
}
}
android AutoCompleteTextView 实现手机号格式化,附带清空历史的操作的更多相关文章
- Xamarin.Android之转换,呼叫,查看历史纪录
Xamarin.Android之转换,呼叫,查看历史纪录 E文文章. 功能:能将输入的字母转换成相应的数字.并且能呼叫出去.能查看呼叫的历史纪录. 界面代码如下: <?xml version=& ...
- Android AutoCompleteTextView和MultiAutoCompleteTextView使用
Android AutoCompleteTextView和MultiAutoCompleteTextView的功能类似于百度或者Google在搜索栏输入信息的时候,弹出的与输入信息接近的提示信息: 它 ...
- [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码
在目录上面右击,有 Reformat Code Ctrl + Alt + L 参考 如何在IntelliJ IDEA或Android Studio中一次性格式化所有代码?
- Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度
Android AutoCompleteTextView 控件实现类似被搜索提示,效果如下 1.首先贴出布局代码 activity_main.xml: <?xml version="1 ...
- 九、Android学习第八天——广播机制与WIFI网络操作(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...
- 【转】android Graphics(四):canvas变换与操作
android Graphics(四):canvas变换与操作 分类: 5.andriod开发2014-09-05 15:05 5877人阅读 评论(18) 收藏 举报 目录(?)[+] 前言 ...
- android Graphics(四):canvas变换与操作
前言:前几篇讲解了有关canvas绘图的一些操作,今天更深入一些,讲讲对画布的操作,这篇文章不像前几篇那么容易理解,如果以前没有接触过画布的童鞋可能比较难以理解,为什么会这样.我尽量多画图,让大家更清 ...
- Android EditText手机号格式化输入XXX-XXXX-XXXX
先来效果图: 设置手机格式化操作只需要设置EditText的addTextChangedListener的监听,下面看代码 /*editText输入监听*/ et_activity_up_login_ ...
- Android之计算缓存大小并且清空缓存
转载博客:http://www.2cto.com/kf/201503/385492.html 项目中碰到了计算缓存大小和清空缓存的功能,这个很常见的功能,几乎每个APP都有,以为实现很简单,网上搜了一 ...
随机推荐
- Navicat——如何导出所有的查询数据
前言 很简单就是通过Navicat的查询来查询~ 步骤 真的不要太简单了~ 打开Navicat并点击查询 新建查询 选择对应的连接和库 写入SQL并运行 导出结果 1.选择导出当前的结果 2.选择保存 ...
- MySQL的IFNULL简单使用说明
MySQL IFNULL函数简介 MySQL IFNULL函数是MySQL控制流函数之一,它接受两个参数,如果不是NULL,则返回第一个参数. 否则,IFNULL函数返回第二个参数. 两个参数可以是文 ...
- JAVA MAIL基本功能
1. [代码][Java]代码package emailrobot; import java.io.*;import java.text.*;import java.util.*;import jav ...
- hadoop2.x安装配置
1.首先准备hadoop2.2.0的安装包,从官网获取,略. 2.加压安装包,进行配置.假设hadoop安装到/usr/hadoop-2.2.0目录,则进行如下配置: (1)/etc/profile配 ...
- Java中的ArrayList
ArrayList是所谓的动态数组.用一个小例子: import java.util.ArrayList; import java.util.Iterator; import java.util.Li ...
- 用mkdirs创建目录
import java.io.*; class a { public static void main(String args[]) { createDir("c:/fuck"); ...
- JAVA 布局控制
在Java里该方法是安一个组件到一个窗体中去,它不同我们使用过的其它GUI系统.首先,它是全代码的:没有控制安放组件的“资源”.其次,该方法的组件被安放到一个被“布局管理器”控制的窗体中,由“布局管理 ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(一)---Windbg的设置
原文发表于百度空间,2009-01-08========================================================================== Windb ...
- BZOJ3895 rock
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3895 看这题感觉好神. SG函数,dp....好像都不行呀. 最后去膜拜题解发现记忆化搜索 囧 ...
- 006--linux基础rpm和yum的使用和源码安装
一.rpm相关命令介绍 1. 查看CD里面有的文件 2. 用rpm来安装一个名为vsftpd的rpm包 3. rpm -qi 软件包名 (查看软件包的详细信息) 4. rpm -ql 软件包名 (查看 ...