次のような文字列を表示する TextView に配置された文字列を作成する必要があります。
最初の部分は太字ではありません BOLD 残りは太字ではありません
だから私はこれを行うためにどのように使用できるか知りたいSpannableStringBuilder
ですか?
これを達成するために 3 つの TextEdit を使用できますが、最適なソリューションを使用したいと思います。
次のような文字列を表示する TextView に配置された文字列を作成する必要があります。
最初の部分は太字ではありません BOLD 残りは太字ではありません
だから私はこれを行うためにどのように使用できるか知りたいSpannableStringBuilder
ですか?
これを達成するために 3 つの TextEdit を使用できますが、最適なソリューションを使用したいと思います。
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);
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;
}
Html
次のクラスを使用して、TextView で HTML コードを使用します。
Spanned styledText = Html.fromHtml("First Part Not Bold <b>BOLD</b> rest not bold");
textView.setText(styledText);
このコードは、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;
}
このコードは、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;
}
色を設定するには、ForegroundColorSpan を setSpan と共に使用します。
sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
それが役に立てば幸い。
だから私はこれが解決されたことを知っています.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 だけだったことです。ループ内で ForegroundColorSpan (またはその他の種類のスパン) を使用するたびに、新しい ForegroundColorSpan を宣言する必要があることがわかります。
SpannableBuilder を使用できるのに、なぜ SpannableStringBuilder を使用するのでしょうか?? ( https://gist.github.com/qtyq/90f9b4894069a8b3676c )
SpannableString ss = SpannableBuilder.init("First Part Not Bold BOLD rest not bold")
.makeBold("BOLD")
.create()