现在的位置: 首页 > 综合 > 正文

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

2018年01月18日 ⁄ 综合 ⁄ 共 3535字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.