android edittext在输入手机号码的时候自动添加分隔符

来源:互联网 发布:炸金花棋牌游戏源码 编辑:程序博客网 时间:2024/05/23 10:12

在输入框输入手机号码,例如13800138000,变成3-4-4的格式

当输入138后面的0的时候,自动添加一个"-",变成138-0的格式;
当输入到138-0013后面的8的时候,自动变成138-0013-8000的格式。


在网上看到有人提出该问题,在此我就给出解答:

<EditText         android:id="@+id/edit"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:inputType="phone"        android:digits="1234567890-"/>
package com.example.edittest;import android.app.Activity;import android.os.Bundle;import android.text.Editable;import android.text.TextWatcher;import android.util.Log;import android.view.Menu;import android.widget.EditText;public class MainActivity extends Activity implements TextWatcher {private static final String TAG = "MainActivity";private static final char SEPARATOR = '-';private static final int FIRST_SEPARATOR_POSITION = 3;private static final int SECOND_SEPARATOR_POSITION = 7;private EditText mPhoneNumberET;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mPhoneNumberET = (EditText) findViewById(R.id.edit);mPhoneNumberET.addTextChangedListener(this);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic void afterTextChanged(Editable aEditable) {Log.d(TAG, "afterTextChanged: " + aEditable.toString());}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {Log.d(TAG, "beforeTextChanged: " + s + ", " + start + ", " + after + ", " + count);}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {Log.d(TAG, "onTextChanged: " + s + ", " + start + ", " + before + ", " + count);Editable phoneNumberEditable = mPhoneNumberET.getEditableText();if (before == 1) {if ((start == FIRST_SEPARATOR_POSITION) || (start == (SECOND_SEPARATOR_POSITION + 1))) {return;}}switch (parsePhoneNumber(phoneNumberEditable.toString())) {case 1:int oneInvalidSeparatorIndex = getOneInvalidSeparatorIndex(phoneNumberEditable.toString());phoneNumberEditable.delete(oneInvalidSeparatorIndex, oneInvalidSeparatorIndex + 1);//删除该“-”break;case 2:phoneNumberEditable.insert(FIRST_SEPARATOR_POSITION, String.valueOf(SEPARATOR));break;case 3:phoneNumberEditable.insert(SECOND_SEPARATOR_POSITION + 1, String.valueOf(SEPARATOR));break;case 4:phoneNumberEditable.delete(phoneNumberEditable.length() - 1, phoneNumberEditable.length());break;case -1:case 0:default:break;}}/* * -1. Invalid. *  * 0. Formatted. *  * 1. Not formatted cause one index at least is a separator, except index 3 * and index 7. *  * 2. Not formatted cause index 3 isn't a separator. *  * 3. Not formatted cause index 7 isn't a separator. *  * 4. Not formatted cause has a separator in the tail. */private int parsePhoneNumber(String phoneNumber) {if (phoneNumber == null) {return -1;}if (getOneInvalidSeparatorIndex(phoneNumber) != -1) {//除index = 3和8是“-”以外,其他位置有“-”时,按1处理return 1;}if ((phoneNumber.length() > FIRST_SEPARATOR_POSITION)//字符数超3个,同时index=3的字符不是“-”,则按2来处理&& (phoneNumber.charAt(FIRST_SEPARATOR_POSITION) != SEPARATOR)) {return 2;}if ((phoneNumber.length() > (SECOND_SEPARATOR_POSITION + 1))//字符数超8个,同时index=8的字符不是“-”,则按3来处理&& (phoneNumber.charAt(SECOND_SEPARATOR_POSITION + 1) != SEPARATOR)) {return 3;}//if ((phoneNumber.length() == (FIRST_SEPARATOR_POSITION + 1))//|| (phoneNumber.length() == (SECOND_SEPARATOR_POSITION + 1 + 1))) {//return 4;//}if(phoneNumber.length()>13)//超过长度,按4处理{return 4;}return 0;}/** * 除index = 3和8是“-”以外,其他位置有“-”时,返回该index * @param phoneNumber * @return */private int getOneInvalidSeparatorIndex(String phoneNumber) {if (phoneNumber == null) {return -1;}for (int index = 0; index < phoneNumber.length(); index++) {if ((index == FIRST_SEPARATOR_POSITION) || (index == (SECOND_SEPARATOR_POSITION + 1))) {continue;}if (phoneNumber.charAt(index) == SEPARATOR) {return index;}}return -1;}}




0 0