1

バックグラウンド

SpannableStringBuilder を使用して複数のものを追加するとします。そのうちの 1 つは、strings.xml ファイルからフォーマットした文字列で、内部にスパンがあります。

SpannableStringBuilder stringBuilder = new SpannableStringBuilder ();
stringBuilder.append(...)...

final SpannableString span = new SpannableString(...);
span.setSpan(new BackgroundColorSpan(0xff990000), ...,...,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
stringBuilder.append(getString(R.string.string_to_format, span));

stringBuilder.append(...)...
textView.setText(stringBuilder);

問題

悲しいことに、そのような文字列をフォーマットするとスパン自体が削除されるため、私の場合、背景色のテキストはありません。

これは、「getString」の行で発生します。

私が試したこと

スパンだけを(「getString」なしで)追加すると、正常に機能します。

Html.fromHtml も調査しようとしましたが、とにかくテキストの背景色をサポートしていないようです。

質問

スパンを持つ文字列をフォーマットすることは可能ですか?

より具体的には、入力は、strings.xml ファイルからの文字列 A で、プレースホルダーのみ (特別な HTML タグはありません) と、実行時にプレースホルダーを置き換える別の文字列 B です。文字列 B は、それ自体の部分的なテキストを強調表示する必要があります。

私の場合、強調表示されたテキストは、文字列 B 内で検索するものです。

4

2 に答える 2

2

OK、私は私の特別な最終的なケースに対する答えを見つけましたが、もっと良い方法があるかどうか知りたいです.

これが私がしたことです:

String stringToSearchAt=...
String query=...
int queryIdx = stringToSearchAt.toLowerCase().indexOf(query);
stringToSearchAt= stringToSearchAt.substring(0,  queryIdx + query.length()) + "<bc/>" + stringToSearchAt.substring(queryIdx + query.length());
final String formattedStr=getString(..., stringToSearchAt);
stringBuilder.append(Html.fromHtml(formattedStr, null, new TagHandler() {
                                    int start;

                                    @Override
                                    public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
                                        switch (tag) {
                                            case "bc":
                                                if (!opening)
                                                    start = output.length() - query.length();
                                                break;
                                            case "html":
                                                if (!opening)
                                                    output.setSpan(new BackgroundColorSpan(0xff00bbaa), start, start + query.length(), 0);
                                        }
                                    }
                                }));

これは私の場合にのみ有効ですが、一般的なフォーマットの場合、これでは不十分です。

于 2016-07-09T19:31:44.143 に答える
1

スパンされた文字列をフォーマットすることは不可能かもしれません.String.format()を使用して文字列を最終的にフォーマットし、それはJava APIであり、SpanはAndroid APIであるためです。

しかし、代わりに html 文字列を使用できると思います。このドキュメントStyling with HTML markup を見てください。

例えば:

String str = "Hi <strong><font color=\"#00bbaa\">%s</font></strong>, Welcome to <em><font color=\"#FF4081\">%s</font></em>";
String text = String.format(str, "Lucy", "Android");
Spanned spanned = Html.fromHtml(text);
// after Html.fromHtml(), you can still change the Span
SpannableString spannableString = new SpannableString(spanned);
spannableString.setSpan(new BackgroundColorSpan(0xff990000), 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);

結果

ここに画像の説明を入力

文字列を string.xml に入れたい場合は、'<' を '<' に、'%s' を '%1$s' に変更する必要があるかもしれません。

<string name="from_offical">Hello &lt;strong>&lt;font color="#00bbaa">%1$s&lt;/font>&lt;/strong>, Welcome to &lt;em>&lt;font color="#00bbaa">%2$s&lt;/font>&lt;/em></string>
于 2016-07-09T07:29:57.757 に答える