2012-02-27 11 views
5

muszę do wykrywania zmian tekstu w EditText. Próbowałem TextWatchera, ale nie działa w sposób, jakiego oczekiwałbym. Weź metodę onTextChanged:Wykrywanie zmian w EditText (TextWatcher nieskutecznego)

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

że mam tekst "John" w już w EditText. Jeśli naciśnij inny przycisk, „e”, s będzie „Johne” start będzie 0, before będzie 4, a count będzie 5. Sposób spodziewałbym ten sposób pracować będzie różnica między tym, co wcześniej EditText było i co się stanie.

Więc chciałbym się spodziewać:

s = "Johne" 
start = 4 // inserting character at index = 4 
before = 0 // adding a character, so there was nothing there before 
count = 1 // inserting one character 

muszę być w stanie wykrywać poszczególne zmiany każdym naciśnięciu klawisza. Więc jeśli mam tekst "John", muszę wiedzieć, że "e" zostało dodane w indeksie 4. Jeśli mam backspace "e", muszę wiedzieć, że "e" zostało usunięte z indeksu 4. Jeśli umieściłem kursor po "J" "i backspace, muszę wiedzieć" J "został usunięty z indeksu 0. Jeśli wstawię" G ", gdzie" J "było, chcę wiedzieć" G "zastąpione" J "na indeksie 0.

Jak czy mogę to osiągnąć? Nie mogę wymyślić wiarygodnego sposobu na zrobienie tego.

+0

try onKeyListener dla EditText –

+0

Co o wklejanie ze schowka? –

+0

Innym problemem, który mam, jest to, że wybrałem zakres tekstowy. W dowolnej z metod TextWatcher, getSelectionStart i End są zawsze tym samym indeksem, niezależnie od tego, czy mam zaznaczony tekst, czy nie. –

Odpowiedz

9

Użyj textwatcher i nie diff siebie. zapisz poprzedni tekst wewnątrz obserwatora, a następnie porównaj poprzedni tekst z sekwencją, którą otrzymasz naTekstChanged. Ponieważ onTextChanged jest uruchamiany po każdym znaku, znasz poprzedni tekst, a dany tekst będzie się różnić co najwyżej jedną literą, co powinno ułatwić ustalenie, która litera została dodana lub usunięta. tj:

new TextWatcher(){ 
    String previousText = theEditText.getText(); 

    @Override 
    onTextChanged(CharSequence s, int start, int before, int count){ 
     compare(s, previousText); //compare and do whatever you need to do 
     previousText = s; 
    } 

    ... 
} 
+0

Jest to sugestia, o której myślałem, a na pewno wykonalna, ale miałem nadzieję na łatwe "tu idziesz!" metoda, która może nie istnieć. Jedynym problemem z twoim podejściem jest to, że tekst może się różnić o więcej niż jedną literę (zakres wyboru, wklejanie ze schowka). –

+1

Prawda, ale w tym momencie indeksy mają niewielkie znaczenie (co się stanie, jeśli wkleisz słowo przed bieżącym tekstem, na przykład?), A nawet wtedy nadal możesz zrobić różnicę samemu. Nie sądzę, że istnieją jakieś wbudowane rozwiązania tego, co próbujesz zrobić. –

+0

Wystarczająco fair. Skończyło się na tym, co powiedziałeś i zasadniczo zaimplementowałem mój własny TextWatcher i przekazałem wartości, których oczekiwałem. To nie jest 100% dowód na głupca, ale jest całkiem blisko. –

0

Musisz zachowywać i aktualizować poprzednie CharSequence za każdym razem, gdy tekst zostanie zmieniony. Możesz to zrobić, wdrażając TextWatcher.

Przykład:

final CharSequence[] previousText = {""}; 
editText.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) 
    { 
     if(i1 > 0) 
     { 
      System.out.println("Removed Chars Positions & Text:"); 
      for(int index = 0; index < i1; index++) 
      { 
       System.out.print((i + index) + " : " + previousText[0].charAt(i + index)+", "); 
      } 
     } 
     if(i2 > 0) 
     { 
      System.out.println("Inserted Chars Positions & Text:"); 
      for(int index = 0; index < i2; index++) 
      { 
       System.out.print((index + i) + " : " + charSequence.charAt(i + index)+", "); 
      } 
      System.out.print("\n"); 
     } 
     previousText[0] = charSequence.toString();//update reference 
    } 

    @Override public void afterTextChanged(Editable editable) 
    { 
    } 
}); 
Powiązane problemy