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 实现手机号格式化附带清空历史的操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-10-25 19:35:38

Android中使用 AutoCompleteTextView 实现手机号格式化附带清空历史的操作的相关文章

实例讲解Android中的AutoCompleteTextView自动补全组件_Android

AutoCompleteTextView是一个具有自动补全功能的EditView,当用户输入数据后,AutoCompleteTextView就会将用户输入的数据与他自己的adapter中的数据对比,如果用户数据与adapter中的某条数据的开始部分完全匹配,那么adapter中的这条数据就会出现在下拉提示框中. 其常用属性定义如下 <AutoCompleteTextView android:id="@+id/mp002_top_place_input" android:layou

实例讲解Android中的AutoCompleteTextView自动补全组件

AutoCompleteTextView是一个具有自动补全功能的EditView,当用户输入数据后,AutoCompleteTextView就会将用户输入的数据与他自己的adapter中的数据对比,如果用户数据与adapter中的某条数据的开始部分完全匹配,那么adapter中的这条数据就会出现在下拉提示框中. 其常用属性定义如下 <AutoCompleteTextView android:id="@+id/mp002_top_place_input" android:layou

Android中的AutoCompleteTextView的使用

最终的效果如下: 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_par

基于Android中的 AutoCompleteTextView实现自动填充_Android

现在我们上网会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android 是通过Android 的AutoCompleteTextView Widget 搭配ArrayAdapter 设计同类似Google 搜索提示的效果. 先在Layout 当中布局一个AutoCompleteTextView Widget ,然后通过预先设置好的字符串数组,将此字符串数组放入ArrayAdapter ,最后利用AutoCompleteTextView.setA

Android中Activity启动模式详解,可以控制程序按home键后进来还会调用一个自己不喜欢的界面

其实这是很简单的一个问题.但是这还是要对android中activity的启动模式有相当的理解才行,当点击home键的时候,懂Android的人都知道,他会把当前activity放到后退栈中, 栈(Stack)又称堆栈,它是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算.人们把此端称为栈顶,栈顶的第一个元素被称为栈顶元素,相对地,把另一端称为栈底.向一个栈插入新元素又称为进栈或入栈,它是把该元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称为出栈或退栈,它是把栈

简单介绍Android中Activity的四种启动模式_Android

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Activity有四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例. 2. singleTop,激活Activity时,如果栈顶是这个Activity,就不会创建新的实例:如果栈顶

Android菜单详解——理解android中的Menu

Android菜单详解--理解android中的Menu 前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu&qu

简单介绍Android中Activity的四种启动模式

在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Activity有四种启动模式: 1. standard,默认的启动模式,只要激活Activity,就会创建一个新的实例,并放入任务栈中,这样任务栈中可能同时有一个Activity的多个实例. 2. singleTop,激活Activity时,如果栈顶是这个Activity,就不会创建新的实例:如果栈顶

Android中AutoCompleteTextView与MultiAutoCompleteTextView的用法_Android

本文以实例列举了Android中AutoCompleteTextView与MultiAutoCompleteTextView的使用方法,具体使用方法如下: 首先看AutoCompleteTextView的使用: 支持基本的自动完成功能,适用在各种搜索功能中,并且可以根据自己的需求设置他的默认显示数据.两个控件都可以很灵活的预置匹配的那些数据,并且可以设置输入多少值时开始匹配等等功能.布局文件很简单,如下所示: <LinearLayout xmlns:android="http://sche