Estoy tratando de reemplazar parte de un Editable regresó de getText() con un palmo.

He intentado getText().replace() pero eso es sólo para CharSequences.

La razón por la que estoy tratando de hacer esto es así ya que se pueden destacar las secciones de un EditText una después de la otra (después de un pequeño retraso), en lugar de ir a través y poner de relieve toda la EditText (que puede ser lento con archivos de gran tamaño).

¿Alguien tiene una pista acerca de cómo me gustaría ir sobre hacer esto?

InformationsquelleAutor AlexPriceAP | 2011-09-07

2 Comentarios

  1. 7

    Este tamaño mínimo ejemplo hace que la palabra ‘primer’ grande:

    public class SpanTest extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            String dispStr = "I'm the first line\nI'm the second line";
            TextView tv = (TextView) findViewById(R.id.textView1);
            int startSpan = dispStr.indexOf("first");
            int endSpan = dispStr.indexOf("line");
            Spannable spanRange = new SpannableString(dispStr);
            TextAppearanceSpan tas = new TextAppearanceSpan(this, android.R.style.TextAppearance_Large);
            spanRange.setSpan(tas, startSpan, endSpan, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            tv.setText(spanRange);
        }
    }

    Que puede adaptarse a sus necesidades

  2. 1

    Me respondió un smilar pregunta recientemente: Cómo utilizar SpannableString con Regex en android?. Pero voy a añadir una copia de la respuesta.

    Aquí una clase que te ayudará a:

    public class Replacer {
    private final CharSequence mSource;
    private final CharSequence mReplacement;
    private final Matcher mMatcher;
    private int mAppendPosition;
    private final boolean mIsSpannable;
    public static CharSequence replace(CharSequence source, String regex,
    CharSequence replacement) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(source);
    return new Replacer(source, matcher, replacement).doReplace();
    }
    private Replacer(CharSequence source, Matcher matcher,
    CharSequence replacement) {
    mSource = source;
    mReplacement = replacement;
    mMatcher = matcher;
    mAppendPosition = 0;
    mIsSpannable = replacement instanceof Spannable;
    }
    private CharSequence doReplace() {
    SpannableStringBuilder buffer = new SpannableStringBuilder();
    while (mMatcher.find()) {
    appendReplacement(buffer);
    }
    return appendTail(buffer);
    }
    private void appendReplacement(SpannableStringBuilder buffer) {
    buffer.append(mSource.subSequence(mAppendPosition, mMatcher.start()));
    CharSequence replacement = mIsSpannable
    ? copyCharSequenceWithSpans(mReplacement)
    : mReplacement;
    buffer.append(replacement);
    mAppendPosition = mMatcher.end();
    }
    public SpannableStringBuilder appendTail(SpannableStringBuilder buffer) {
    buffer.append(mSource.subSequence(mAppendPosition, mSource.length()));
    return buffer;
    }
    //This is a weird way of copying spans, but I don't know any better way.
    private CharSequence copyCharSequenceWithSpans(CharSequence string) {
    Parcel parcel = Parcel.obtain();
    try {
    TextUtils.writeToParcel(string, parcel, 0);
    parcel.setDataPosition(0);
    return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
    } finally {
    parcel.recycle();
    }
    }
    }

    Y un ejemplo de uso:

    CharSequence modifiedText = Replacer.replace("ABC aaa AB ABC aa ad ABC", "ABC",
    Html.fromHtml("<font color=\"red\">CBA</font>"));
    textView.setText(modifiedText);
    • Gracias @Miguel de la clase auxiliar. Una cosa que me gustaría añadir es que su copyCharSequenceWithSpans debe tener reciclado de la Parcela objeto.
    • gracias por tu comentario! Se corrigió.

Dejar respuesta

Please enter your comment!
Please enter your name here