2014-10-15 4 views
5

Ich versuche tatsächlich Kartenformatierung zu tun, für die ich zu implementieren bin versucht, was Google sagt von linkWie man setSpan() in onTextChanged() verwendet, um Parameter von onTextChanged() zu speichern?

Sie sind nicht gesagt, wo der Wechsel stattfand, weil andere afterTextChanged() -Methoden bereits andere Änderungen vorgenommen haben und die Offsets ungültig gemacht. Aber wenn Sie das hier wissen müssen, können Sie setSpan (Object, int, int, int) in onTextChanged (CharSequence, int, int, int) verwenden, um Ihren Platz zu markieren und dann von hier nachzusehen, wo die Zeitspanne endete.

Von oben, was ich verstehe ist, ich brauche [vor CharSequence s, int Start, int, int count] speichern unter Verwendung setSpan in OnTextChanged() und sie irgendwie in afterTextChanged abrufen zurück().

Frage ist, auf welches Objekt ich SetSpan() in OnTextChanged() aufrufen und wie ich diese gespeicherten Werte in afterTextChanged() abrufen.

+2

Ich frage mich die gleiche Sache, für einen fast identischen Anwendungsfall. Hast du das jemals herausgefunden? –

Antwort

3

Also habe ich das herausgefunden. Unten ist ein Barebone-Beispiel, das als Ausgangspunkt verwendet werden kann.

import android.text.Editable; 
import android.text.SpannableString; 
import android.text.Spanned; 
import android.text.TextWatcher; 
import android.text.style.RelativeSizeSpan; 

public class AwesomeTextWatcherDeluxe implements TextWatcher { 

    private RelativeSizeSpan span; 
    private SpannableString spannable; 


    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     // We can use any span here. I use RelativeSizeSpan with size 1, which makes absolutely nothing. 
     // Perhaps there are other spans better suited for it? 
     span = new RelativeSizeSpan(1.0f); 
     spannable = new SpannableString(s); 
     spannable.setSpan(span, start, start + count, Spanned.SPAN_COMPOSING); 
    } 

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

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     int beginIndex = spannable.getSpanStart(span); 
     int endIndex = spannable.getSpanEnd(span); 

     // Do your changes here. 

     // Cleanup 
     spannable.removeSpan(span); 
     span = null; 
     spannable = null; 
    } 
} 
+0

Wow, das sieht erschreckend aus. Ich habe mich auch damit herumgesprochen und herausgefunden, dass man CharSequence s grundsätzlich in Spannable umwandeln kann, da Parameter s in den meisten Fällen eine Unterklasse ist, die Spannable als ein span-Objekt implementiert, man kann TextWatcher selbst benutzen (passiere das). – kravitz