Android에서 strings.xml 문자열의 굵은 단어


114

strings.xml의 문자열 중 하나에 긴 텍스트가 있습니다. 굵게 표시하고 해당 텍스트에서 일부 단어의 색상을 변경하고 싶습니다.

내가 어떻게 해?


전체적으로 달성하려는 목표에 대해 좀 더 구체적으로 말할 수 있습니까?
Brian

답변:


192

기본적으로 다음과 같은 문자열 리소스에서 html 태그를 사용할 수 있습니다.

<resource>
    <string name="styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

그리고 Html.fromHtml을 사용하거나 spannable을 사용하여 게시 한 링크를 확인하십시오.

오래된 비슷한 질문 : TextView 안에 여러 스타일을 가질 수 있습니까?


16
또한 리소스 문자열을 사용하는 방법에 따라 CDATA 블록에 굵게 / 기울임 꼴 태그를 넣어야 할 수 있습니다. 이렇게하면 다음에서 사용할 때까지 구문 분석되지 않습니다 Html.fromHtml(). ... <![CDATA[<b><i>so</i></b>]]>...
dule

133
이에 조금 너무 막연한 공식 안드로이드 문서를 발견 다른 사람을 위해 : 당신이 당신의 문자열 리소스에 <B>와 같은 태그를 사용하는 경우, 당신이 사용하여 검색 할 수 있도록 getText(R.string.whatever)보다는getString(R.string.whatever)
andygeers

1
name대신 해야하지 id않습니까?
Hendra Anggrian

4
따라서 Html.fromHtml또는 Spannable. getText(R.string.whatever)언급 한 @andygeers처럼 사용하십시오 .
Alaa M. 2016

1
@andygeers 단일 매개 변수 만 허용하므로 getText를 사용할 수없는 "내 이름은 <b> % s </ b>"와 같은 문자열에 대해 무엇을 할 수 있습니까?
Taylor

45

문자열 리소스 내에서 html 태그 사용 :-

<resources>
<string name="string_resource_name"><![CDATA[<b> Your text </b>]]> </string>
</resources>

다음과 같은 문자열 리소스에서 굵은 텍스트를 가져옵니다.

private Spanned getSpannedText(String text) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return Html.fromHtml(text, Html.FROM_HTML_MODE_COMPACT);
        } else {
            return Html.fromHtml(text);
        }
    }


 String s = format(context.getResources().getString(R.string.string_resource_name));
 textView.setText(getSpannedText(s));

그것은 최고의 대답이며 @BindingAdapter를 사용하는 사람들에게 완전히 작동합니다. 고마워, 형제.
Sup.Ia

44

David Olsson이 말했듯이 문자열 리소스에서 HTML을 사용할 수 있습니다.

<resource>
    <string name="my_string">A string with <i>actual</i> <b>formatting</b>!</string>
</resources>

그런 다음 getText(R.string.my_string)대신 사용 하면 서식이 포함 된 대신 getString(R.string.my_string)a CharSequence가 반환 String됩니다.


gettext에이 아닌 Spannable의 CharSequence를 반환
티그 Babajanyan

1
문자열이 숫자를 추가해야하는 수량이면 어떻게됩니까?
Taylor

getText에서는 자리 표시자를 사용할 수 없습니다.
Vincent_Paing

10

kotlin에서는 문자열을 html 범위로 변환하는 리소스 (activities | fragments | context)에 확장 함수를 만들 수 있습니다.

예 :

fun Resources.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Resources.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = getQuantityString(id, quantity).toHtmlSpan()

fun Resources.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = getQuantityString(id, quantity, *formatArgs).toHtmlSpan()

fun String.toHtmlSpan(): Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
    Html.fromHtml(this)
}

용법

//your strings.xml
<string name="greeting"><![CDATA[<b>Hello %s!</b><br>]]>This is newline</string>

//in your fragment or activity
resources.getHtmlSpannedString(R.string.greeting, "World")

더 많은 확장 편집

fun Context.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Context.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Context.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Context.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()


fun Activity.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Activity.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Activity.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Activity.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()


fun Fragment.getHtmlSpannedString(@StringRes id: Int): Spanned = getString(id).toHtmlSpan()

fun Fragment.getHtmlSpannedString(@StringRes id: Int, vararg formatArgs: Any): Spanned = getString(id, *formatArgs).toHtmlSpan()

fun Fragment.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int): Spanned = resources.getQuantityString(id, quantity).toHtmlSpan()

fun Fragment.getQuantityHtmlSpannedString(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): Spanned = resources.getQuantityString(id, quantity, *formatArgs).toHtmlSpan()

@Himanshu Mori 일부 스 니펫이 도움이 될 것입니다. kotlin 수업에서 사용하고 있습니까?
svkaka

1
활동 확장은 필요하지 않습니다. 활동은 컨텍스트 그 자체입니다
Farshad Tahmasbi

2

Strings.xml

<string name="my_text"><Data><![CDATA[<b>Well Done !</b><br></br>All of your activities are completed.<br></br>You may now close the app.<br></br>See you again next time.]]></Data></string>

설정

textView.setText(Html.fromHtml(getString(R.string.activity_completed_text)));

1

문자열에서 할 수 있습니다.

 <resources xmlns:tools="http://schemas.android.com/tools">

 <string name="total_review"><b>Total Review: </b> </string>

 </resources>

다음과 같은 자바 코드에서 액세스 할 수 있습니다.

proDuctReviewNumber.setText(getResources().getString(R.string.total_review)+productDetailsSuccess.getProductTotalReview());

1

strings.xml

<string name="sentence">This price is <b>%1$s</b> USD</string>

page.java

String successMessage = getString(R.string.message,"5.21");

이 가격 5.21 USD


1
매개 변수를 전달하려면 기본 기능을 사용해야합니다. "{1}"대신 "% 1 $ s"를 입력하고 replace ()없이 getString (R.string.message, "5.21")을 호출하십시오.
Adrian Grygutis

문서는이 답변을 지원합니다 : developer.android.com/guide/topics/resources/… HTML 파서를 통해 전달되어야하지만
ProjectDelta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.