Android Development: How To Replace Part Of An Edittext With A Spannable
I'm trying to replace part of an Editable returned from getText() with a span. I've tried getText().replace() but that's only for CharSequences. The reason I'm trying to do this is
Solution 1:
This minimal size example makes the word 'first' large:
publicclassSpanTestextendsActivity {
@OverridepublicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
StringdispStr="I'm the first line\nI'm the second line";
TextViewtv= (TextView) findViewById(R.id.textView1);
intstartSpan= dispStr.indexOf("first");
intendSpan= dispStr.indexOf("line");
SpannablespanRange=newSpannableString(dispStr);
TextAppearanceSpantas=newTextAppearanceSpan(this, android.R.style.TextAppearance_Large);
spanRange.setSpan(tas, startSpan, endSpan, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(spanRange);
}
}
You can adapt it to your needs
Solution 2:
I answered a smilar question recently: How to use SpannableString with Regex in android?. But I'll add a copy of that answer.
Here's a class that will help you:
publicclassReplacer {
privatefinal CharSequence mSource;
privatefinal CharSequence mReplacement;
privatefinal Matcher mMatcher;
privateint mAppendPosition;
privatefinalboolean mIsSpannable;
publicstatic CharSequence replace(CharSequence source, String regex,
CharSequence replacement) {
Patternpattern= Pattern.compile(regex);
Matchermatcher= pattern.matcher(source);
returnnewReplacer(source, matcher, replacement).doReplace();
}
privateReplacer(CharSequence source, Matcher matcher,
CharSequence replacement) {
mSource = source;
mReplacement = replacement;
mMatcher = matcher;
mAppendPosition = 0;
mIsSpannable = replacement instanceof Spannable;
}
private CharSequence doReplace() {
SpannableStringBuilderbuffer=newSpannableStringBuilder();
while (mMatcher.find()) {
appendReplacement(buffer);
}
return appendTail(buffer);
}
privatevoidappendReplacement(SpannableStringBuilder buffer) {
buffer.append(mSource.subSequence(mAppendPosition, mMatcher.start()));
CharSequencereplacement= 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) {
Parcelparcel= Parcel.obtain();
try {
TextUtils.writeToParcel(string, parcel, 0);
parcel.setDataPosition(0);
return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
} finally {
parcel.recycle();
}
}
}
And an example of usage:
CharSequence modifiedText =Replacer.replace("ABC aaa AB ABC aa ad ABC", "ABC",
Html.fromHtml("<font color=\"red\">CBA</font>"));
textView.setText(modifiedText);
Post a Comment for "Android Development: How To Replace Part Of An Edittext With A Spannable"