Bold words in a string of strings.xml in Android

前端 未结 9 2094
甜味超标
甜味超标 2020-12-01 02:44

I have a long text in one of the strings at strings.xml. I want to make bold and change the color of some words in that text.

How can I do it?

相关标签:
9条回答
  • 2020-12-01 02:50

    In kotlin, you can create extensions functions on resources (activities|fragments |context) that will convert your string to an html span

    e.g.

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

    Usage

    //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")
    

    EDIT even more extensions

    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()
    
    0 讨论(0)
  • 2020-12-01 02:51

    Use html tag inside string resources :-

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

    And get bold text from string resources like :-

    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));
    
    0 讨论(0)
  • 2020-12-01 02:52

    I was having a text something like:

    Forgot Password? Reset here.

    To implement this the easy way I used the existing android:textStyle="bold"

    <LinearLayout
            android:id="@+id/forgotPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center"
            >
    
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:autoLink="all"
                android:linksClickable="false"
                android:selectAllOnFocus="false"
    
                android:text="Forgot password? "
                android:textAlignment="center"
                android:textColor="@android:color/white"
                />
    
            <TextView
    
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:autoLink="all"
                android:linksClickable="false"
                android:selectAllOnFocus="false"
    
                android:text="Reset here"
                android:textAlignment="center"
                android:textColor="@android:color/white"
                android:textStyle="bold" />
        </LinearLayout>
    

    Maybe it helps someone

    0 讨论(0)
  • 2020-12-01 02:56

    As David Olsson has said, you can use HTML in your string resources:

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

    Then if you use getText(R.string.my_string) rather than getString(R.string.my_string) you get back a CharSequence rather than a String that contains the formatting embedded.

    0 讨论(0)
  • 2020-12-01 02:57

    You could basically use html tags in your string resource like:

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

    And use Html.fromHtml or use spannable, check the link I posted.

    Old similar question: Is it possible to have multiple styles inside a TextView?

    0 讨论(0)
  • 2020-12-01 02:58

    You can do it from string

     <resources xmlns:tools="http://schemas.android.com/tools">
    
     <string name="total_review"><b>Total Review: </b> </string>
    
     </resources>
    

    and can access it from the java code like

    proDuctReviewNumber.setText(getResources().getString(R.string.total_review)+productDetailsSuccess.getProductTotalReview());
    
    0 讨论(0)
提交回复
热议问题