Skip to content Skip to sidebar Skip to footer

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"