Các từ in đậm trong chuỗi string.xml trong Android


114

Tôi có một văn bản dài trong một trong các chuỗi tại string.xml. Tôi muốn tô đậm và thay đổi màu của một số từ trong văn bản đó.

Tôi làm nó như thế nào?


Bạn có thể cụ thể hơn một chút về những gì bạn đang cố gắng đạt được tổng thể không?
Brian

Câu trả lời:


192

Về cơ bản, bạn có thể sử dụng các thẻ html trong tài nguyên chuỗi của mình như:

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

Và sử dụng Html.fromHtml hoặc sử dụng spannable, kiểm tra liên kết tôi đã đăng.

Câu hỏi cũ tương tự: Có thể có nhiều kiểu bên trong TextView không?


16
Ngoài ra, tuỳ theo cách bạn sử dụng chuỗi tài nguyên của bạn, bạn có thể cần phải đặt / thẻ nghiêng đậm trong một khối CDATA vì vậy họ không được phân tích cú pháp cho đến khi nó được sử dụng bởi Html.fromHtml(): ... <![CDATA[<b><i>so</i></b>]]>...
Dule

133
Đối với bất cứ ai khác đã tìm thấy các tài liệu chính thức Android một chút quá mơ hồ về điều này: nếu bạn sử dụng thẻ như <b> trong tài nguyên chuỗi của bạn, hãy chắc chắn bạn lấy nó bằng cách sử getText(R.string.whatever)hơngetString(R.string.whatever)
andygeers

1
nó không phải là namethay vì id?
Hendra Anggrian

4
Vì vậy, không cần Html.fromHtmlhoặc Spannable. Chỉ cần sử dụng getText(R.string.whatever)như @andygeers đã đề cập.
Alaa M.

1
@andygeers Chúng ta có thể làm gì đối với một chuỗi như "Tên tôi là <b>% s </b>" không thể sử dụng getText vì nó chỉ chấp nhận một tham số duy nhất?
Taylor

45

Sử dụng thẻ html bên trong tài nguyên chuỗi: -

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

Và lấy văn bản in đậm từ các tài nguyên chuỗi như: -

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

đó là câu trả lời tốt nhất và nó hoàn toàn phù hợp với những người sử dụng @BindingAdapter. Cám ơn anh.
Sup.Ia

44

Như David Olsson đã nói, bạn có thể sử dụng HTML trong các tài nguyên chuỗi của mình:

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

Sau đó, nếu bạn sử dụng getText(R.string.my_string)thay vì getString(R.string.my_string)bạn nhận lại một CharSequencethay vì một Stringchứa định dạng được nhúng.


gettext trả CharSequence không phải là một Spannable
Tigran Babajanyan

1
Điều gì sẽ xảy ra nếu chuỗi của bạn là một số lượng mà bạn cần thêm một số vào?
Taylor

getText không cho phép bạn sử dụng trình giữ chỗ
Vincent_Paing

10

Trong kotlin, bạn có thể tạo các hàm mở rộng trên tài nguyên (hoạt động | phân đoạn | ngữ cảnh) sẽ chuyển đổi chuỗi của bạn thành một khoảng html

ví dụ

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

Sử dụng

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

CHỈNH SỬA nhiều tiện ích mở rộng hơn nữa

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 một số đoạn mã sẽ hữu ích. Bạn có đang sử dụng nó trong lớp kotlin không?
svkaka

1
Tiện ích mở rộng hoạt động là không cần thiết, Hoạt động chính là Ngữ cảnh
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>

Để thiết lập

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

1

Bạn có thể làm điều đó từ chuỗi

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

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

 </resources>

và có thể truy cập nó từ mã java như

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

1

string.xml

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

page.java

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

Giá này 5,21 USD


1
Bạn nên sử dụng chức năng gốc để chuyển các tham số. Chỉ cần đặt "% 1 $ s" thay vì "{1}" và gọi getString (R.string.message, "5.21") mà không cần thay thế ()
Adrian Grygutis

Tài liệu hỗ trợ câu trả lời này: developer.android.com/guide/topics/resources/… Mặc dù nó cần phải được chuyển qua trình phân tích cú pháp HTML
ProjectDelta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.