web-dev-qa-db-ja.com

複数のフォント/テキストサイズなどの文字列を作成するSpannableStringBuilderの例?

このような文字列を表示するTextViewに配置された文字列を作成する必要があります。

太字でない最初の部分[〜#〜] bold [〜#〜]太字ではありません

だから私は SpannableStringBuilder を使用してこれを行う方法を知りたいですか?

3つのTextEditを使用してこれを実現できますが、最善の解決策を使用したいと思います。

67
Code Droid
First Part Not Bold   BOLD  rest not bold

これは、@ Rajeshが提案したように、またはこれによって行うことができます。

String normalBefore= "First Part Not Bold ";
String normalBOLD=  "BOLD ";
String normalAfter= "rest not bold";
String finalString= normalBefore+normalBOLD+normalAfter;
Spannable sb = new SpannableString( finalString );
sb.setSpan(new StyleSpan(Android.graphics.Typeface.BOLD), finalString.indexOf(normalBOLD)+ normalBOLD.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //bold
sb.setSpan(new AbsoluteSizeSpan(intSize), finalString.indexOf(normalBOLD)+ normalBOLD.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//resize size

これをTextViewで表示するには

textview.setText(sb,  TextView.BufferType.SPANNABLE);
72
Azhar Shaikh

受け入れられた答えは問題ありません(私はそれを支持しました)が、提出者が要求したとおりにSpannableStringBuilderを使用することに失敗します。 Builderが最も理にかなっているケースがあるので、ここにそのコードを示します(他の人に役立つ場合は、テキストの色を変更するというボーナス使用もあります)。 SpannableStringBuilderコンストラクターに初期文字列を提供することもできますが、ここでは「append」を使用するように設定し、目的の「太字」テキストの前に多くを追加して、次に示すように開始を記録できることを明確にします。これも受け入れられた答えよりも速いコードだと思います。

SpannableStringBuilder longDescription = new SpannableStringBuilder();
longDescription.append("First Part Not Bold ");
int start = longDescription.length();
longDescription.append("BOLD");
longDescription.setSpan(new ForegroundColorSpan(0xFFCC5500), start, longDescription.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
longDescription.setSpan(new StyleSpan(Android.graphics.Typeface.BOLD), start, longDescription.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
longDescription.append(" rest not bold");
70
Josh

API 21より、SpannableStringBuilderにはこれを行う簡単なメソッドが含まれています。ソリューションの例を次に示します。

SpannableStringBuilder builder= new SpannableStringBuilder();
StyleSpan boldSpan = new StyleSpan(Android.graphics.Typeface.BOLD);
builder.append("First Part Not Bold ")
              .append("BOLD ", boldSpan, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
              .append("rest not bold");

API 21をサポートしていない可能性が高いので、そのメソッドからコードを複製できます。

public SpannableStringBuilder append(CharSequence text, Object what, int flags) {
        int start = length();
        append(text);
        setSpan(what, start, length(), flags);
        return this;
}
36
Gober

Kotlinを使用している場合は、 Android-ktx ライブラリを使用して以下を実行できます

val s = SpannableStringBuilder()
        .append("First Part Not Bold ")
        .bold { append("BOLD") } 
        .append("Rest not bold")

boldは、SpannableStringBuilderの拡張関数です。使用できる操作のリストについては、ドキュメント here を参照してください。

もう一つの例:

val s = SpannableStringBuilder()
            .color(green, { append("Green text ") })
            .append("Normal text ")
            .scale(0.5, { append("Text at half size " })
            .backgroundColor(green, { append("Background green") })

ここで、greenは解決されたRGBカラーです。

スパンをネストすることも可能です。そのため、DSLが埋め込まれます。

bold { underline { italic { append("Bold and underlined") } } }

アプリモジュールレベルで次のものが必要ですbuild.gradle動作するように:

repositories {
    google()
}

dependencies {
    implementation 'androidx.core:core-ktx:0.3'
}
15
David Rawson

Html クラスを使用してTextViewでHTMLコードを使用します。

Spanned styledText = Html.fromHtml("First Part Not Bold <b>BOLD</b> rest not bold");
textView.setText(styledText);
6
Rajesh

このコードは、html太字タグ内にあるすべてを太字に設定する必要があります。また、タグも削除するため、内部のコンテンツのみが表示されます。

        SpannableStringBuilder sb = new SpannableStringBuilder("this is <b>bold</b> and this is <b>bold too</b>  and this is <b>bold too, again</b>.");

        Pattern p = Pattern.compile("<b>.*?</b>", Pattern.CASE_INSENSITIVE);            
        boolean stop = false;
        while (!stop)
        {
            Matcher m = p.matcher(sb.toString());
            if (m.find()) {
                sb.setSpan(new StyleSpan(Android.graphics.Typeface.BOLD), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                sb.delete(m.end()-4, m.end());
                sb.delete(m.start(), m.start() + 3);
            }
            else
                stop = true;
        }

このコードは、スーパースクリプト(supタグ)など、他のhtmlスタイルのタグにも適用できます。

        SpannableStringBuilder sb = new SpannableStringBuilder("text has <sup>superscript</sup> tag");

        Pattern p = Pattern.compile("<sup>.*?</sup>", Pattern.CASE_INSENSITIVE);            
        boolean stop = false;
        while (!stop)
        {
            Matcher m = p.matcher(sb.toString());
            if (m.find()) {
                sb.setSpan(new SuperscriptSpan(), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                sb.delete(m.end()-6, m.end());
                sb.delete(m.start(), m.start() + 5);
            }
            else
                stop = true;
        }

色を設定するには、setSpanでForegroundColorSpanを使用するだけです。

sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);

それが役に立てば幸い。

4
live-love

だから私はこれが解決されたことを知っており、SpannableStringBuilderで要求されたとしても、あなたが文字列をより動的に構築したい場合には私はこれを置くと思った。

// Stuff needed
TextView DataTextView = (TextView)rootView.findViewById(R.id.DataView);
String Fields[] = {...database column names as strings... "x","y"};

String DataString = new String();   

int start,stop;     // Start and Stop of formatting

// Final Result
SpannableStringBuilder coloredString = new SpannableStringBuilder(); 

SpannableString temp;       // Small segment of colored string
for (int i =0; i < Fields.length; i++)
{
    if (database_result.containsKey(Fields[i]))  // Be sure a field exists in the ContentValues
    {
            DataString = Fields[i]+": ";
        start = DataString.length();
        DataString = DataString+ +database_result.getAsInteger(Fields[i])+" ";
        stop= DataString.length();
        temp = new SpannableString(DataString);
        temp.setSpan(new ForegroundColorSpan(Color.WHITE),start, stop, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        coloredString.append(temp);
    }   
}
DataTextView.setText(coloredString);

database_resultは、返されたSQLクエリのCursor型から作成したContentValues型です。私がこれに関して抱えていた唯一の問題は、最初は最初のセグメントのColorSpaningだけでした。ループで1つ(または他の種類のスパン)を使用するたびに、新しいForegroundColorSpanを宣言する必要があることを継ぎ合わせます。

3
Zeppie

SpannableStringBuilderTextAppearanceSpan と組み合わせて使用​​することもできます。以下の手順に従って、そのように実装します。

  1. styles.xmlでスタイルを作成します。
<style name="BoldStyle">
   <!-- Can add other styling attributes -->
   <item name="Android:textStyle">bold</item>
   ......
</style>
  1. 以下のコードを使用してください。
 SpannableStringBuilder builder = new SpannableStringBuilder( "First Part Not Bold BOLD rest not bold"); 
 builder.setSpan(new TextAppearanceSpan(this、R.style.BoldStyle)、20、24、0) ; 
((TextView)findViewById(R.id.tv7))。setText(builder); 

それでおしまい。それが誰かを助けることを願っています。

2

SpannableBuilderを使用できるのに、なぜSpannableStringBuilderを使用するのですか? ( https://Gist.github.com/qtyq/90f9b4894069a8b3676c

SpannableString ss = SpannableBuilder.init("First Part Not Bold BOLD rest not bold")
                                     .makeBold("BOLD")
                                     .create()
1
qtyq