2012-12-28 19 views
6

biçimini biçimlendirir TextWatcher ile bir EditText var. Metnin 5'9 "gibi bir insan boyuna biçimlendirilmesi gerekiyordu. Fakat kullanıcı bir hata yaptığında ve yanlış yazılan karakteri silmek istediğinde TextWather bunu yapmasına izin vermiyor. Kullanıcı" silmek istediğini "söyleyelim TextWather onu hemen geri ekler. Kod aşağıdadır. Peki kullanıcının EditText'teki metni silmesine nasıl izin verebilirim?TextWatcher ile EditText'deki metni nasıl silerim? Her zaman bir dize algılar ve onun

private class CustomTextWatcher implements TextWatcher { 
    private EditText mEditText; 

public CustomTextWatcher(EditText e) { 
    mEditText = e; 
} 

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 s) { 
    int count = s.length(); 
    String str = s.toString(); 
    if (count == 1) { 
     str = str + "'"; 
    } else if (count == 3) { 
     str = str + "\""; 
    } else if ((count > 4) && (str.charAt(str.length() - 1) != '\"')) { 
     str = str.substring(0, str.length() - 2) 
       + str.charAt(str.length() - 1) + "\""; 
    } else { 
     return; 
    } 
    mEditText.setText(str); 
    mEditText.setSelection(mEditText.getText().length()); 


} 

}

cevap

8

, az önce kullanıcı kullanır ne anahtar dinlemek basit düzeltme ekleyebilir.

varolan koduna herhangi bir gerçek test veya başka iyileştirmeler olmadan, bu sizin tarif sorunu çözmek gibi görünüyor:

package com.example.testwatchertest; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnKeyListener; 
import android.widget.EditText; 

public class MainActivity extends Activity implements TextWatcher { 

    EditText editText; 
    boolean keyDel = false; 

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

     editText = (EditText) findViewById(R.id.editText); 
     editText.addTextChangedListener(this); 

     editText.setOnKeyListener(new OnKeyListener() { 

      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 

       if (keyCode == KeyEvent.KEYCODE_DEL){ 
        keyDel = true; 
       }else{ 
        keyDel = false; 
       } 
       return false; 
      } 
     }); 

    } 

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

    } 

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

    } 

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

     if (!keyDel) { 

      String str = s.toString(); 
      if (count == 1) { 
       str = str + "'"; 
      } else if (count == 3) { 
       str = str + "\""; 
      } else if ((count > 4) && (str.charAt(str.length() - 1) != '\"')) { 
       str = str.substring(0, str.length() - 2) + str.charAt(str.length() - 1) + "\""; 
      } else { 
       return; 
      } 
      editText.setText(str); 
      editText.setSelection(editText.getText().length()); 

     } 

    } 

} 
+0

Teşekkür ederim Stefan. Bu sorunu giderdi. Kodu afterTextChanged() yöntemlerine taşıdım ve anahtar durumunu kontrol etmek için boole kullanıyorum. İşe yaradı. Tekrar teşekkürler. –

+0

Herhangi bir nedenden dolayı, kullanıcı hatayı düzelttikten sonra yazmayı denediğinde TextWatcher çalışmaz mı? Yani bir karakter yanlış yazılmış ve sonra onu siler ve TextWatcher 've' sembolleri eklemiyor tekrar yazmaya çalışır. Bunu nasıl giderebilirim? –

+1

OnKeyListener Samsung Galaxy üzerinde çalışmıyor, ancak Motorola Xoom üzerinde çalışıyor. –

2

From the docs:

kamu soyut boşluk (CharSequence s, int başlangıç, int önce, int adet)

Bu yöntem size bildirmek için çağrılır OnTextChanged Bu, başlangıçta karakterlerinin başından beriolan eski metni değiştirdidaha önce. Bu geri aramada arası değişiklikler yapmaya teşebbüs etmek bir hatadır.

afterTextChanged() öğesinde, diğer iki geri aramada hiçbir değişiklik yapmamanız gerekir.

kamu soyut boşluk Bu yöntem bir yere s içinde, metin değişti olmuştur başladığını bildirmek için çağrılır (Düzenlenebilir s)

afterTextChanged. Bu geri çağrısından daha fazla değişiklik yapmak için meşrudur, ancak, numaralı sonsuz döngüye girmemeye dikkat edin, çünkü yaptığınız değişiklikler, bu yöntemin tekrar tekrar çağrılmasına neden olacaktır. (Değişiklik diğer afterTextChanged() yöntemleri zaten başka değişiklikler yapmış olabilir çünkü gerçekleşti ve uzaklıklar geçersiz nerede söyledi değildir. Ama burada bilmeniz gereken ise, size yeri işaretlemek için onTextChanged(CharSequence, int, int, int) yılında setSpan(Object, int, int, int) kullanmak ve daha sonra bakabilirsiniz yayılma sona erdi nerede buradan.) Karakuri kodunuzu yanlış geri aramasında olma konusunda yayınlanan gerçeğini göz ardı edilmesi

+0

Ben afterTextChanged() yöntemine kodunu taşındı ve herhangi bir fark yoktu. Mesajımı güncelledim. Teşekkürler. –