格式化分隔手机号码

效果图:


主布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.demo.EdittextDemoActivity" 
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <EditText 
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"/>
    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="设置"
        android:onClick="setUp"/>
</LinearLayout>

activity:

package com.example.demo;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;

public class EdittextDemoActivity extends Activity implements OnCheckedChangeListener {
    private EditText et;
    
    private EditText etPasswordTxtTest;
    private CheckBox cbPasswordTxtTest;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_edittext_demo);
		et = (EditText) findViewById(R.id.et);
		et.addTextChangedListener(new MyTextWatcher(et));
		
		etPasswordTxtTest = (EditText) findViewById(R.id.et_password_txt_test);
		cbPasswordTxtTest = (CheckBox) findViewById(R.id.cb_password_txt_test);
		cbPasswordTxtTest.setOnCheckedChangeListener(this);
	}
	public void setUp(View v){
		et.setText("12345678901");
	}  
	
    public static class MyTextWatcher implements TextWatcher {  
        
        private EditText phoneNumberEditText;   
        String  tmp ; 
  
        int start,count,beforeSelectionStart; 
        public MyTextWatcher(EditText numberEditText) {  
            this.phoneNumberEditText = numberEditText;  
        }  
  
        @Override  
        public void onTextChanged(CharSequence s, int start, int before,int count) {  
        	System.out.println("onTextChanged ---- start = "+start+" before = "+before+" count = "+count+"  s= "+s);
        	this.start = start;
        	this.count = count;
        }  
  
        @Override  
        public void beforeTextChanged(CharSequence s, int start, int count,int after) { 
        	beforeSelectionStart = phoneNumberEditText.getSelectionStart();
        	System.out.println("beforeTextChanged getSelectionStart="+phoneNumberEditText.getSelectionStart());
        	System.out.println("beforeTextChanged ---- start = "+start+" count = "+count + " after = "+after+"  s= "+s);
        }  
  
        @Override  
        public void afterTextChanged(Editable s) {     
        	System.out.println("---afterTextChanged---");
        	
        	char c = '-';//' ';
   		    String sourceStr = s.toString();
			if(tmp != null && tmp.equals(sourceStr )){ 
   		    	return;
   		    } 
			tmp = separateString(sourceStr, 3, 3, c); 
			if(!tmp.equals(sourceStr) ){
				phoneNumberEditText.setText(tmp);  
				System.out.println("start = "+start + " s.length = "+s.length()+" count = "+count);
				if(start == 0 ){
					if(s.length() == ( count-1)){
						phoneNumberEditText.setSelection(tmp.length());
					}else if (s.length() ==  count) {
						phoneNumberEditText.setSelection(beforeSelectionStart);
					}
					
				}
				//phoneNumberEditText.setSelection(tmp.length());  
			}   
        }
        /**
         * 用指定字符分隔格式化字符串
         * <br/>(如电话号为1391235678 指定startIndex为3,step为4,separator为'-'经过此处理后的结果为 <br/> 139-1234-5678)
         * @param source 需要分隔的字符串
         * @param startIndex  开始分隔的索引号
         * @param step 步长
         * @param separator 指定的分隔符
         * @return 返回分隔格式化处理后的结果字符串
         */
		private String separateString(String source, int startIndex, int step,char separator) {
			int times = 0;
			StringBuilder tmpBuilder = new StringBuilder(source); 
			for(int i = 0;i<tmpBuilder.length();i++){
				if(i == startIndex + step * times + times){//if(i == 3 || i == 8){
					if(separator != tmpBuilder.charAt(i)){
						tmpBuilder.insert(i, separator); 
					}
					times++;
				}else {
					if(separator == tmpBuilder.charAt(i)){
						tmpBuilder.deleteCharAt(i);
						i=-1;
						times = 0;
					}
				}
			}
			return tmpBuilder.toString();
		}  
    }

	@Override
	public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
		if(isChecked){
			etPasswordTxtTest.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
		}else {
			etPasswordTxtTest.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
		}
		System.out.println("txt = " + etPasswordTxtTest.getText().toString());
	}  
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值