2012-05-31 1 views
51

私はこのような文字列が表示されますのTextViewに配置された文字列を作成する必要があります。複数のフォント/テキストサイズなどで文字列を作成するSpannableStringBuilder例?

BOLD残り太字ない前編太字ないので、私はどのように私ができるかを知りたいですこれを行うにはSpannableStringBuilderを使用しますか?

これを達成するために3つのTextEditを使用することができましたが、私は最高のソリューションを使いたいと思います。 Htmlクラスを使用してのTextViewで

答えて

54
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); 
+0

TextEditはどのように設定されていますか? –

+0

また太字のようにフォントサイズを設定するにはどうしたらいいですか?私はそれが太字で、フォント20と言うことを両方とも指定していますか? –

+6

indexを更新してください(finalString.indexOf(normalBOLD)、finalString.indexOf(normalBOLD)+ normalBOLD.lenth()) –

4

使用HTMLコードは:

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

これは実際には遅く、スクロール中にフレームがスキップされる可能性が高いことに注意してください。 –

60

でこれを表示するために受け入れられた答えは結構です(と私はそれをupvoted)が、それは提出者が要求したとして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"); 
+2

また、テキストの太字部分の開始位置を追加する前に、その単語の重複を心配する必要はありません太字にする。 – Qw4z1

4

だから私は、これを解決し、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を宣言する必要があります。

4

このコードでは、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; 
     } 

このコードはまた、単にsetSpanとForegroundColorSpanを使用し、色を設定する等のSuperscript(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; 
     } 

に適合させることができます。

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

希望します。

23

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をサポートしていない良い機会ですので、あなたがそのメソッドからコードを複製することができます。

することができますあなたがSpannableStringBuilderを使用するのはなぜ
public SpannableStringBuilder append(CharSequence text, Object what, int flags) { 
     int start = length(); 
     append(text); 
     setSpan(what, start, length(), flags); 
     return this; 
} 
0

SpannableBuilderを使用しますか? (https://gist.github.com/qtyq/90f9b4894069a8b3676c

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

spannablebuilderは1つのスパンを作成するため、spannablestringbuilderは複数の異なるスパンを持つcharsequencesを作成するためです – dabluck

0

我々はまた、それを達成するためにTextAppearanceSpanSpannableStringBuilderを使用することができます。このような手順を実行するには、以下の手順に従います。

  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); 

。誰かを助けることを願っています。

関連する問題