有个小伙伴遇到了这样一个问题,就是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 实现手机号格式化,附带清空历史的操作的更多相关文章

  1. Xamarin.Android之转换,呼叫,查看历史纪录

    Xamarin.Android之转换,呼叫,查看历史纪录 E文文章. 功能:能将输入的字母转换成相应的数字.并且能呼叫出去.能查看呼叫的历史纪录. 界面代码如下: <?xml version=& ...

  2. Android AutoCompleteTextView和MultiAutoCompleteTextView使用

    Android AutoCompleteTextView和MultiAutoCompleteTextView的功能类似于百度或者Google在搜索栏输入信息的时候,弹出的与输入信息接近的提示信息: 它 ...

  3. [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码

    在目录上面右击,有 Reformat Code Ctrl + Alt + L 参考 如何在IntelliJ IDEA或Android Studio中一次性格式化所有代码?

  4. Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度

    Android AutoCompleteTextView 控件实现类似被搜索提示,效果如下 1.首先贴出布局代码 activity_main.xml: <?xml version="1 ...

  5. 九、Android学习第八天——广播机制与WIFI网络操作(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...

  6. 【转】android Graphics(四):canvas变换与操作

    android Graphics(四):canvas变换与操作 分类: 5.andriod开发2014-09-05 15:05 5877人阅读 评论(18) 收藏 举报   目录(?)[+]   前言 ...

  7. android Graphics(四):canvas变换与操作

    前言:前几篇讲解了有关canvas绘图的一些操作,今天更深入一些,讲讲对画布的操作,这篇文章不像前几篇那么容易理解,如果以前没有接触过画布的童鞋可能比较难以理解,为什么会这样.我尽量多画图,让大家更清 ...

  8. Android EditText手机号格式化输入XXX-XXXX-XXXX

    先来效果图: 设置手机格式化操作只需要设置EditText的addTextChangedListener的监听,下面看代码 /*editText输入监听*/ et_activity_up_login_ ...

  9. Android之计算缓存大小并且清空缓存

    转载博客:http://www.2cto.com/kf/201503/385492.html 项目中碰到了计算缓存大小和清空缓存的功能,这个很常见的功能,几乎每个APP都有,以为实现很简单,网上搜了一 ...

随机推荐

  1. monitor.sh java脚本学习

    #! /bin/bash# unset any variable which system may be using# clear the screen while getopts ivh named ...

  2. Oracle:spool 的一个用法

    spool 是sqlplus的一个语法,非sql. 平时,我们通过ssh或者xmanger连接到oracle后,如果我们想把我们在上面操作的脚本及脚本执行过程.结果保存下来的话,可以通过spool来实 ...

  3. input type=password 浏览器会自动填充密码的问题

    解决办法是在form上或input上添加autoComplete="off"这个属性. form表单的属性如下所示: 但是这个解决方案在谷歌和火狐上均有bug,下面来一个一个解决. ...

  4. A - Two Substrings

    Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description You ar ...

  5. k8s-创建自定义chart及部署efk-二十五

    一.chart的结构 (1)更改helm为阿里云仓库源 [root@master helm]# helm repo remove stable "stable" has been ...

  6. 详解Redis Cluster集群

    Redis Cluster是Redis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求.当遇到单机内存.并发.流量等瓶颈时,可以采用Cluster架构达到负载 ...

  7. codeforces 632C

    题意: 给n个字符串,然后将这些字符串组合,搞成一个最小字典序的字符串,然后输出就好了. 思路: 记得以前神队友给我说过你怎么将n个字符串按字典序的比较从小到大输出.那么我也是这样玩一下,然后组合输出 ...

  8. python __builtins__ filter类 (24)

    24.'filter', 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表.该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True ...

  9. bzoj 3811: 玛里苟斯【线性基+期望dp】

    这个输出可是有点恶心啊--WA*inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5 ...

  10. 解决eNSP路由器AR启动失败错误代码40,交换机正常的问题

    问题描述 eNSP昨晚正常使用,今天上午出现问题:AR路由器启动失败,错误代码40.但交换机可正常启动. eNSP版本:eNSP V100R002C00B510 Setup.exe 操作系统:Wind ...