2013-03-19 4 views
2

내 응용 프로그램에서는 사용자가 전화 번호를 입력하는 editText를 가지고 있습니다. 즉, 사용자가 전화 번호를 입력하자마자 (텍스트를 변경 한 리스너를 적용한 것처럼) 형식은 XXX-XXX-XXXX입니다. 안드로이드의 전화 번호 형식

나는

ePhone.addTextChangedListener(new TextWatcher() { 

      private Pattern pattern; 
      private Matcher matcher; 
      String a; 


      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       // TODO Auto-generated method stub 

       boolean flag = true;    
       if (flag) { 

        if (((ePhone.getText().length() + 1) % 4) == 0) 
        { 
         if (ePhone.getText().toString().split("-").length <= 2) 
         { 
          ePhone.setText(ePhone.getText() + "-"); 
          ePhone.setSelection(ePhone.getText().length()); 
         } 
        } 
        a = ePhone.getText().toString(); 
       } else { 
        ePhone.setText(a); 
       } 
      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 
       // TODO Auto-generated method stus 

      } 
     }); 

로 코드를 작성하지만, 사용자가이 editText에서 번호를 삭제하고자 할 때, 그가 제대로 작동하지 않습니다. 미리 감사드립니다.

+0

편집 텍스트 코너에서 사용자가 해당 버튼을 클릭하면 모든 것을 지우면 닫기 버튼이 표시됩니다. – AndroidEnthusiastic

답변

7

미국 형식으로 전화 번호를 형식화한다고 가정합니다.

+1 (###) ###-####,1 (###) ###-####,###-####,###-###-####,011 $ 

다음은 당신의 목적을 될 것입니다 : 각 위치 즉, 위치 특정 서비스가 필요한 경우

phoneEditText.addTextChangedListener(new TextWatcher() { 
    private boolean mFormatting; // a flag that prevents stack overflows. 
    private int mAfter; 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 

    //called before the text is changed... 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     mAfter = after; // flag to detect backspace. 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
    // Make sure to ignore calls to afterTextChanged caused by the work done below 
     if (!mFormatting) { 
      mFormatting = true; 
      // using US formatting. 
      if(mAfter != 0) // in case back space ain't clicked. 
       PhoneNumberUtils.formatNumber(
        s,PhoneNumberUtils.getFormatTypeForLocale(Locale.US)); 
      mFormatting = false; 
     } 
    } 
}); 

을, 당신은 그 장소 (this link 참조)의 특정 형식이 필요합니다. 필요한 형식 만 필요한 경우 위 코드 조각의 줄 대신 사용자 지정 함수를 작성하십시오.

PhoneNumberUtils.formatNumber(
    s, PhoneNumberUtils.getFormatTypeForLocale(Locale.US));  
0

이 코드는 삭제 및 편집 모두에서 작동합니다.

public class PhoneNumberFormattingTextWatcher implements TextWatcher { 
EditText Edt; 
int keyDel=0; 
public PhoneNumberFormattingTextWatcher(EditText edt){ 
Edt =edt; 
} 
@Override 
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

} 

@Override 
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
    Edt.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 

      if (keyCode == KeyEvent.KEYCODE_DEL) 
       keyDel = 1; 
      return false; 
     } 
    }); 

    if (keyDel == 0) { 
     int len = Edt.getText().length(); 
     String input=Edt.getText().toString(); 
     if(len == 4) { 
      Edt.setText(input.substring(0,3)+"-"+ input.substring(3)); 
      Edt.setSelection(Edt.getText().length()); 
     } 
     if(len == 8) { 
      Edt.setText(input.substring(0,7)+"-"+ input.substring(7)); 
      Edt.setSelection(Edt.getText().length()); 
     } 
    } else if(keyDel==1){ 
     int len = Edt.getText().length(); 
     if(len == 4||len==8) { 
      Edt.setText(Edt.getText().delete(Edt.getText().length()-1,Edt.getText().length())); 
      Edt.setSelection(Edt.getText().length()); 
     } 
     keyDel = 0; 
    } 
} 

@Override 
public void afterTextChanged(Editable editable) { 

} 

}

-1

당신은 작동 foolowing 코드를 사용할 수 있습니다.

String number="5129892680"; 
String formattedNumber = PhoneNumberUtils.formatNumber(number);