在输入框输入手机号码,例如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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPhoneNumberET = (EditText) findViewById(R.id.edit);
mPhoneNumberET.addTextChangedListener(this);
}
@Override
public 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;
}
@Override
public void afterTextChanged(Editable aEditable) {
Log.d(TAG, "afterTextChanged: " + aEditable.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d(TAG, "beforeTextChanged: " + s + ", " + start + ", " + after + ", " + count);
}
@Override
public 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;
}
}