在输入框输入手机号码,例如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; } }