2016-11-18 45 views
0

私は単純なバイナリ10進変換器を構築しています。ユーザーが入力するとバイナリ文字列を4ビットのグループにフォーマットします。EditTextに空白を自動的に追加する方法

"afterTextChanged"メソッドでeditableを操作することができましたが、アプリを実行して4桁の数字を入力するとアプリがフリーズし、RAMモニタがクレイジーになります。

また、私のedittext "binary"は "numberDecimal"に設定されています。私はHereというものを使って一時的に変更しようとしましたが、うまく動作しないようです。 (バイナリは私のEditTextです)

binary.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 


     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 

      if(binary.isFocused()){ 

       temp = binary.getText().toString().replaceAll("\\s+",""); 

        if(temp.length()%4==0){ 
        InputFilter[] filters = editable.getFilters(); // save filters 
        editable.setFilters(new InputFilter[] {});  // clear filters 
        editable.insert(editable.length()-1," ");    // edit text 
        editable.setFilters(filters); 
        } 

は、事前にありがとう:Dあなたが代わりに TranformationMethodを実装する必要があり

+0

Woops! editable.insert()内に数字を置くと、すべて正常に動作します。しかし、私は空白を入れる必要があります –

答えて

0

は、ここでは、コードです。 TextWatcherを使用すると、afterTextChanged()が変更されたときに別の変更が発生するという問題があります。変更に対応する際の注意点が慎重でないと、無限にループすることになります。

+0

うーん...私はドキュメントを読んだが、私はTrasformationMethodの仕組みを理解していません。 TrasformationMethodを拡張する新しいクラスを作成する必要がありますか? –

+0

@AlessandroSperottiそれはインターフェースです、あなたのクラスはそれを 'implement'して' extend'してはいけません。 – Karakuri

0

このコードは、スペースが自動的に追加される前に文字列を区切り、グループを4文字に分割します。私はそれが

0

に役立つことを願っています

EditText ed; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    ed = (EditText)findViewById(R.id.editText); 
    ed.addTextChangedListener(new TextWatcher() 
    { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) 
     { 
      if (count == 4) 
      { 
       ed.setText(ed.getText()+" "); 
       ed.setSelection(ed.getText().length()); 
      } 
     } 
     @Override 
     public void afterTextChanged(Editable s) {} 
    }); 

私は考え出し:追加のスペースは何とか無限ループをトリガーました。スペースを追加する前にフォーカスを削除し、その後にフォーカスを追加することを解決しました。私はまたif条件にいくつかの変更を加えたので、カーソルを止めずにバイナリ番号を簡単に削除できます。 TEMPSPACEは、ユーザーがボタンを押す前のEditTextの長さを比較するために使用される一時的な変数である

@Override 
public void afterTextChanged(Editable editable) { 

     if(binary.isFocused()){ 

       if(((temp.length()%4 == 0 && temp.length()!=0) && tempSpace.length()<temp.length()) || (tempSpace.isEmpty() && temp.length()%4 == 0)){ 

          InputFilter[] filters = editable.getFilters(); // save filters 
          editable.setFilters(new InputFilter[] {}); 

          binary.clearFocus();        // clear filters 
          editable.insert(editable.length()," "); 
          binary.requestFocus(); 
                  // edit text 
          editable.setFilters(filters); 
       } 

       tempSpace= temp; 

お返事ありがとうございます。D

関連する問題