usuario texto studio sgoliver que interfaz indice controles caja basicos android replace spannablestring spannable

texto - Desarrollo de Android: cómo reemplazar parte de un EditText con un Spannable



sgoliver adapter (2)

Estoy tratando de reemplazar parte de un Editable devuelto por getText () con un lapso.

He intentado getText (). Replace () pero eso es solo para CharSequences.

La razón por la que trato de hacer esto es para poder resaltar secciones de un EditText una tras otra (después de un pequeño retraso), en lugar de pasar y resaltar todo el EditText (que puede ser lento con archivos grandes).

¿Alguien tiene una pista sobre cómo haré esto?


Este ejemplo de tamaño mínimo hace que la palabra "primero" sea 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); } }

Puedes adaptarlo a tus necesidades


Recientemente, respondí una pregunta similar: ¿Cómo usar SpannableString con Regex en Android? . Pero agregaré una copia de esa respuesta.

Aquí hay 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);