EditText afterTextChangedでsetText入力方式を使用した異常問題


QQ群:372135639
EditTextで入力したID番号をセグメント化する必要があります.たとえば、1234567890123456778は123456 7890 1234 5678と表示されます.私のやり方は
etIDCard.addTextChangedListener(new IDCardNumberWatcher());  //      ,       ,               


class IDCardNumberWatcher implements TextWatcher {    


          public void beforeTextChanged(CharSequence s, int start, int count,    
                  int after) {    

          }    

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

          }    

          public void afterTextChanged(Editable editable) {    
             edIDCard.removeTextChangedListener(this);//     ,     ,          
             edIDCard.setText(getFormatIDCard(editable.toString()));//              
             etIDCard."color:black;">addTextChangedListener(this); //      ,          
} }   

/** 
*         ,  :123456789012345678    123456 7890 1234 5678 
*/  
private String getFormatIDCard(String str){  
  String result = null;  
  //        
  return result;  
}  

上のコードは完璧に見えて、欲しい効果を実現することができて、ほほほ、これは背景の紹介にすぎません.次に問題を見ます.
質問:携帯電話のデフォルトの入力方式がグーグルの入力方式であれば(古い穴の前奏で、他の入力法はそんなことはないでしょう)では、ユーザー体験はこうです.数字の制限がないので、この入力ボックスは数字、アルファベット、中国語などを入力することができます.つまり、キーボード入力法はデジタルディスクとアルファベットディスクまたはその他に切り替えることができます.EditTextに対して以上のコードの傍受をしている場合、グーグルのキーボードユーザーがデジタルディスクに切り替えると、数字を入力すると、キーボードモードは自動的に数字盤からデフォルトの文字盤に戻ります.
一言:数字盤に数字を入力するたびに、キーボードは自動的にアルファベット盤に切り替わります.
これはだめだよ,改め,改め!
理由:一言一言の注釈を経てテストを実行し、afterTextChangedの中のsetTextに問題があることを発見しました.setTextのたびに、キーボードのレイアウトがokに変わり、setTextで目的を達成できません.では、他の方法を考えましょう.
解決:afterTextChangedのsetText文を次のように変更します.
[java] view plain copy print? editable.replace(0,editable.length,getFormatIDCard(editable.toString()));
  :
     ,     ,    ,  ~

   :
1.      EditText   xml   :Android:digits="0123456789xX",         

2. TextWatcher      EditText  setText,      removeTextChangedListener setText,   addTextChangedListener,    setText        ,  StackOverFlow,   ~

3.           :^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$