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

(0)

相关推荐

  • Android中AutoCompleteTextView与MultiAutoCompleteTextView的用法

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

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

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

  • Android AutoCompleteTextView控件使用实例

    使用要点如下: 1.利用ListAdapter(一般使用ArrayAdapter)为AutoCompleteTextView提供数据,若有需要还可以重载getView()以自定义列表项的显示方式.这一步同ListView.2.如果需要根据输入内容进行动态提示,那么adapter需要实现Filterable接口,重载getFilter()函数实现提示算法.getFilter()需返回Filter对象,该对象包含至少两个方法:performFiltering()在后台执行过滤,publishResu

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

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

  • Android中EditText和AutoCompleteTextView设置文字选中颜色方法

    EditText和AutoCompleteTextView设置文字选中颜色 大多数Android Rom上,文本选择的背景色都是很好看的鲜绿色, 但是在某些垃圾的三星手机上,居然是蓝色,令人恶心反感,其实完全可以通过程序来修改,文本的默认选中背景色. 所用API解释 复制代码 代码如下: android:textColorHighlight Color of the text selection highlight. EditText设置效果 AutoCompleteTextView 设置效果

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

    有个小伙伴遇到了这样一个问题,就是AutoCompleteTextView实现自动填充的功能.同时要具备手机格式化的功能.下拉列表最后一行是有个清除历史的功能.可是点击"清除历史"却把文字要设置进去AutoCompleteTextView中.这样的效果显然很糟糕.所以我就写了这样一个简单的demo.来帮助遇到这种问题的朋友解决这样一个问题.二话不多说直接上代码. 布局文件(activity_main.xml)代码如下: <?xml version="1.0"

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

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

  • Android中Activity的四种启动模式和onNewIntent()

    写在前面 Activity是Android四大组件之一,用于直接跟用户进行交互,本篇文章将介绍Activity的启动流程.用户启动Activity的方式大致有两种:一种是在桌面点击应用程序的图标,进入应用程序的主界面:另一种是在应用程序中,进入一个新的Activity.前者,桌面其实是系统应用launcher的界面,点击应用程序图标,会进行应用程序的主界面,实质是从一个应用的Activity进入另一个应用Activity. 因此,不管是从桌面进入应用主界面,还是在应用里进入一个新的Activit

  • Android中手机号、车牌号正则表达式大全

    手机号 手机名称有GSM:表示只支持中国联通或者中国移动2G号段(130.131.132.134.135.136.137.138.139.145.147.150.151.152.155.156.157.158.159.182.185.186.187.188) 手机名称有CDMA:表示只支持中国电信2G号段(133.153.180.181.189) 手机名称有WCDMA/GSM:表示支持中国联通或者中国移动2G号段,以及中国联通3G号段(130.131.132.134.135.136.137.13

  • Android中Intent习惯用法

    Android中的Intent是一个非常重要的类,如果对Intent不是特别了解,可以参见<详解Android中Intent的使用方法>.如果对Intent Filter不是特别了解,可以参见<详解Android中Intent对象与Intent Filter过滤匹配过程>. 本文着重讲一下Android中一些常见的Intent的习惯用法,比如如何通过Intent发送短信.发送邮件.启动摄像机拍照录视频.设置闹铃.打开WIFI设置界面等等. 限于篇幅,本文分为上下两篇,这是上篇. 发

  • Android中使用HTTP服务的用法详解

    在Android中,除了使用Java.NET包下的API访问HTTP服务之外,我们还可以换一种途径去完成工作.Android SDK附带了Apache的HttpClient API.Apache HttpClient是一个完善的HTTP客户端,它提供了对HTTP协议的全面支持,可以使用HTTP GET和POST进行访问.下面我们就结合实例,介绍一下HttpClient的使用方法. 我们新建一个http项目,项目结构如图: 在这个项目中,我们不需要任何的Activity,所有的操作都在单元测试类H

随机推荐