テキストビューを使用して、Webサービスからの文字列を保持しています。文字列はこのような形式で提供されます。「サンプルテキスト{{b}}太字テキスト{{/b}}など」。テキストビューで太字のテキストを太字で表示する必要があります。1回の操作で、文字列を渡すことができます。色、フォントなどのプロパティを持つ文字列を使用する機会はありますか?
注:テキストの解析に問題はありません。解析したテキストをtextviewに渡す方法を見つけたいだけです。
ありがとう
テキストビューでテキストを設定するときは、次を使用します。
mytextview.setText(Html.fromHtml(sourceString));
次に、実際の形式のテキストを取得します。
SpannableStringを使用してこの問題を解決しました。コードが必要な人は、このクラスを自由に変更できます。
public class RichTextHelper {
public static SpannableStringBuilder getRichText(String text){
SpannableStringBuilder builder=new SpannableStringBuilder();
String myText=text;
boolean done=false;
while(!done){
if((myText.indexOf("{{b}}")>=0) && (myText.indexOf("{{b}}")<myText.indexOf("{{/b}}"))){
int nIndex=myText.indexOf("{{b}}");
String normalText=myText.substring(0,nIndex);
builder.append(normalText);
myText=myText.substring(nIndex+5);
}else if((myText.indexOf("{{/b}}")>=0)){
int bIndex=myText.indexOf("{{/b}}");
String boldText=myText.substring(0,bIndex);
builder.append(boldText);
myText=myText.substring(bIndex+6);
int start=builder.length()-bIndex-1;
int end =builder.length();//-1;
if((start>=0) && (end>start)){
builder.setSpan(new StyleSpan(Typeface.BOLD), start, end, 0);
}
}else{
if(myText.contains("{{/b}}"))
myText=myText.replace("{{/b}}", "");
builder.append(myText);
done=true;
}
}
return builder;
}
}
選んだ答えでは満足のいく結果が得られないと思いました。2つの文字列を受け取る独自の関数を作成しました。全文と太字にしたいテキストの一部。
'text'から'textToBold'を太字にしたSpannableStringBuilderを返します。
タグでラップせずに部分文字列を太字にする機能は便利だと思います。
/**
* Makes a substring of a string bold.
* @param text Full text
* @param textToBold Text you want to make bold
* @return String with bold substring
*/
public static SpannableStringBuilder makeSectionOfTextBold(String text, String textToBold){
SpannableStringBuilder builder=new SpannableStringBuilder();
if(textToBold.length() > 0 && !textToBold.trim().equals("")){
//for counting start/end indexes
String testText = text.toLowerCase(Locale.US);
String testTextToBold = textToBold.toLowerCase(Locale.US);
int startingIndex = testText.indexOf(testTextToBold);
int endingIndex = startingIndex + testTextToBold.length();
//for counting start/end indexes
if(startingIndex < 0 || endingIndex <0){
return builder.append(text);
}
else if(startingIndex >= 0 && endingIndex >=0){
builder.append(text);
builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0);
}
}else{
return builder.append(text);
}
return builder;
}