cara membuat teks tertentu pada TextView BOLD

252

Saya tidak tahu cara membuat teks tertentu di TextView menjadi BOLD.

seperti ini

txtResult.setText(id+" "+name);

Saya ingin hasilnya seperti ini:

1111 neil

iddan nameadalah variabel yang telah saya ambil nilainya dari database, dan saya ingin membuatnya idmenjadi tebal, tetapi hanya idsupaya nametidak akan terpengaruh, saya tidak tahu bagaimana melakukan ini.

Budi Darmawan
sumber
1
Kemungkinan rangkap dari Apakah mungkin memiliki beberapa gaya di dalam TextView?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
4 cara - string spesifik pada TextView bold - Pasti membantu Anda.
c49

Jawaban:

379

Cukup buat String Anda dalam HTML dan atur:

String sourceString = "<b>" + id + "</b> " + name; 
mytextview.setText(Html.fromHtml(sourceString));
Raghav Sood
sumber
5
Karena fromHtml (sourceString) sudah tidak digunakan lagi di API 24, Anda harus menggunakan kode berikutnya: Spanned durasiSpanned; if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {durasiSpanned = Html.fromHtml (durasiFormatted, Html.FROM_HTML_MODE_LEGACY); } else {durationSpanned = Html.fromHtml (durasiFormatted); }
Mladen Rakonjac
2
Ini adalah satu-satunya opsi yang akan berfungsi jika Anda melokalisasi aplikasi Anda.
howettl
Ini solusi yang bagus tapi saya tahu itu tidak berfungsi untuk <dan> solusi @ wtsang02 lebih optimal
Omar Boshra
Ini tidak berfungsi dengan <JIKA Anda menggunakan String.format, KECUALI Anda juga lolos dari braket, seperti dijelaskan di sini .
Yusuf X
5
Html.fromHtml()sekarang sudah tidak digunakan lagi
Seseorang di suatu tempat
384

Meskipun Anda dapat menggunakan Html.fromHtml () Anda dapat menggunakan pendekatan yang lebih asli yaitu SpannableStringBuilder , posting ini mungkin helful.

SpannableStringBuilder str = new SpannableStringBuilder("Your awesome text");
str.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), INT_START, INT_END, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView tv=new TextView(context);
tv.setText(str);
wtsang02
sumber
Jika jawaban ini tidak berfungsi, coba tambahkan teks Anda dengan string yang dapat diputar beberapa hal seperti: mSpannable.append (yourremainingtext);
Gowtham Kumar
10
Untuk orang-orang yang datang dari Google tanpa pengetahuan sebelumnya: INT_START / INT_END adalah lokasi di mana huruf tebal harus dimulai dan berakhir.
Spotlight
2
jika Anda hanya perlu menerapkan beberapa markup ke string sumber tanpa mengubahnya, maka Anda lebih baik menggunakan kelas
SpannableString
26
Ini akan benar-benar rusak jika Anda perlu melokalkan salinan Anda. INT_START dan INT_END akan menempati posisi berbeda di berbagai lokasi.
howettl
4
Cobalah untuk memahami apa yang dilakukan kode ketika ragu. Awal int adalah angka yang Anda tentukan, yang merupakan indeks awal rentang. Coba 0 untuk memulai, string. (). Size () untuk akhir.
wtsang02
85

Pertama: Anda tidak perlu khawatir menggunakan kode kinerja lambat dari jawaban Raghav Sood .

Kedua: Anda tidak perlu menulis fungsi ekstensi yang disediakan oleh jawaban w3bshark saat menggunakan Kotlin.

Finnaly: Yang perlu Anda lakukan adalah menggunakan perpustakaan android-ktx Kotlin dari Google (lihat di sini untuk menemukan informasi lebih lanjut dan cara memasukkannya ke proyek Anda):

// Suppose id = 1111 and name = neil (just what you want). 
val s = SpannableStringBuilder()
          .bold { append(id) } 
          .append(name)
txtResult.setText(s) 

Menghasilkan: 1111 neil


MEMPERBARUI:

Karena saya pikir itu dapat membantu orang lain serta menunjukkan seberapa jauh Anda bisa pergi ke sini lebih banyak menggunakan kasus.

  • Saat Anda perlu menampilkan teks dengan beberapa bagian berwarna biru dan miring:

    val myCustomizedString = SpannableStringBuilder()
        .color(blueColor, { append("A blue text ") })
        .append("showing that ")
        .italic{ append("it is painless") }
  • Saat Anda perlu menampilkan teks dalam huruf tebal dan miring:

        bold { italic { append("Bold and italic") } }

Singkatnya, bold, append, colordan italicadalah fungsi ekstensi untuk SpannableStringBuilder. Anda dapat melihat fungsi ekstensi lain dalam dokumentasi resmi , dari tempat Anda dapat memikirkan kemungkinan lain.

Filipe Brito
sumber
Ini bagus dan semua tapi saya pikir setiap jawaban yang terkait dengan string harus mempertimbangkan terjemahan. Kata-kata dalam kalimat dapat dipesan dan disusun dengan sangat berbeda dalam beberapa bahasa sehingga menambahkan seperti ini tidak selalu berlaku dalam situasi tertentu. Juga tidak ideal untuk hal-hal seperti string kuantitas dalam XML.
Edward van Raak
1
@CoolMind Itu tidak membuat Anda tidak dapat menggunakan Android KTX. Anda dapat menemukan informasi dari github.com/android/android-ktx tentang cara melaporkan bug, membuat saran fitur, atau berkontribusi ke perpustakaan itu. Jadi, itu masih referensi yang valid. Saya telah memperbarui jawaban saya untuk memasukkan lebih banyak informasi tentang perpustakaan dan bagaimana menggunakannya di proyek Anda.
Filipe Brito
1
berikan orang ini medali untuk solusi dan sumber daya modern ini !! Terima kasih!!!
Sjd
37

Saya pikir jawaban yang dipilih tidak memberikan hasil yang memuaskan. Saya telah menulis fungsi saya sendiri yang membutuhkan 2 string; Teks lengkap dan bagian teks yang ingin Anda cetak tebal.

Ini mengembalikan SpannableStringBuilder dengan 'textToBold' dari 'text' bolded.

Saya menemukan kemampuan untuk membuat substring tebal tanpa membungkusnya dengan tag yang bermanfaat.

    /**
     * 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;
  }
Eitan
sumber
Bisakah Anda memberikan contoh cara menggunakan ini dalam kode?
Micro
2
@MicroR Anda harus mengirimkan dua String, String kedua harus berupa bagian teks yang terkandung di dalam yang pertama. mis. makeSectionOfTextBold ("Ini adalah teks yang bagus.", "hebat").
Leon
1
Anda harus mengubah pernyataan if Anda dengan if (textToBold! = null &&! textToBold.isEmpty ())
Arda Kara
2
Fungsi ini tidak berharap substring dapat muncul dalam teks penuh beberapa kali. Misalnya di "Nama pengguna saya adalah nama", tidak dapat membuat huruf "nama" kedua.
Jadamec
1
Maka metode ini sebenarnya harus dinamai makeAllBold (teks, textToBold).
wtsang02
30

Seperti kata wtsang02, menggunakan HTML adalah biaya overhead yang mahal. Cukup gunakan solusi asli. Jika Anda tidak perlu memodifikasi string, cukup gunakan SpannableString, bukan SpannableStringBuilder.

String boldText = "id";
String normalText = "name";
SpannableString str = new SpannableString(boldText + normalText);
str.setSpan(new StyleSpan(Typeface.BOLD), 0, boldText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(str);
Jadamec
sumber
23

Jika Anda ingin menggunakan string dari XML, Anda dapat melakukan sesuatu seperti ini:

strings.xml (bagian "CDATA" itu penting, jika tidak maka tidak akan berfungsi)

<string name="test">
     <![CDATA[
 <b>bold!</b> normal
    ]]>
</string>

file tata letak

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_gravity="center" />

</FrameLayout>

kode

textView.text = HtmlCompat.fromHtml(getString(R.string.test), HtmlCompat.FROM_HTML_MODE_LEGACY)
pengembang android
sumber
Ini bekerja untuk saya <string name="test"><b>text bold</b> other text</string>. Tidak berfungsi jika saya menulis<![CDATA[
sara
@sara Diuji lagi sekarang, pada Pixel 2 dengan Q. Bekerja dengan baik. Di sini, saya memperbarui cara kerjanya dengan Kotlin. Silakan coba lagi.
pengembang android
Ini adalah jawaban yang dapat diterima jika Anda menggunakan font khusus. Kudus ke creater.
Raghul Sugathan
13

Sederhana saja cukup tutup teks yang ditentukan seperti ini misalnya <b>"your text here:"</b>

<string name="headquarters">"<b>"Headquarters:"</b>" Mooresville, North Carolina, U.S.</string>

hasil: Kantor Pusat: Mooresville, North Carolina, AS

Ridha Rezzag
sumber
Ini hanya berfungsi jika string digunakan dari xml. Jika string ini disebut terprogram, pengkodean html akan dihapus.
Starwave
11

Jika Anda menggunakan Kotlin, itu menjadi lebih mudah dilakukan dengan menggunakan core-ktx, karena menyediakan bahasa khusus domain (DSL) untuk melakukan ini:

val string: SpannedString = buildSpannedString {
    bold {
        append("foo")
    }
    append("bar")     
}

Lebih banyak opsi yang disediakan olehnya adalah:

append("Hello There")
bold {
    append("bold")
    italic {
        append("bold and italic")
        underline {
            append("then some text with underline")
        }
    }
}

Akhirnya, Anda bisa langsung ke:

textView.text = string
Devansh Maurya
sumber
10

Ini solusi yang lebih baik jika Anda ingin membuat banyak teks menjadi tebal. Saya telah memperbaiki kode Eitan. terima kasih Eitan.

public static SpannableStringBuilder makeSectionOfTextBold(String text, String... textToBold) {
    SpannableStringBuilder builder = new SpannableStringBuilder(text);

    for (String textItem :
            textToBold) {
        if (textItem.length() > 0 && !textItem.trim().equals("")) {
            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textItem.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();

            if (startingIndex >= 0 && endingIndex >= 0) {
                builder.setSpan(new StyleSpan(Typeface.BOLD), startingIndex, endingIndex, 0);
            }
        }
    }

    return builder;
}
Krish
sumber
8

Berdasarkan jawaban @ mladj0ni, saya mendapatkan kode di bawah ini untuk berfungsi. Masalahnya adalah jika Anda menggunakan String.format , itu menghapus markup html, jadi Anda harus keluar dari simbol braket di strings.xml:

strings.xml:

<string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>

code.java:

String unspanned = String.format(Locale.US, "%s%s", getResources().getString(R.string. welcome_messages), 99);

Spanned spanned;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
    spanned = Html.fromHtml(unspanned, Html.FROM_HTML_MODE_LEGACY);
} else {
    spanned = Html.fromHtml(unspanned);
}

textView.setText(spanned);

Ini lebih sederhana daripada SpannableStringBuilder. Sedangkan untuk kinerja, jika Anda hanya menampilkan satu string, maka pengguna tidak akan melihat milidetik tambahan untuk menguraikannya.

Lihat dokumentasi di sini .

Yusuf X
sumber
Terima kasih untuk & lt; b> ... & lt; / b>
oxied
4

Anda dapat menggunakan kode ini untuk mengatur bagian teks Anda menjadi tebal. Untuk apa pun yang ada di antara tag html tebal, itu akan membuatnya tebal.

String myText = "make this <b>bold</b> and <b>this</b> too";
textView.setText(makeSpannable(myText, "<b>(.+?)</b>", "<b>", "</b>"));

public SpannableStringBuilder makeSpannable(String text, String regex, String startTag, String endTag) {

            StringBuffer sb = new StringBuffer();
            SpannableStringBuilder spannable = new SpannableStringBuilder();

            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(text);
            while (matcher.find()) {
                sb.setLength(0);
                String group = matcher.group();
                String spanText = group.substring(startTag.length(), group.length() - endTag.length());
                matcher.appendReplacement(sb, spanText);

                spannable.append(sb.toString());
                int start = spannable.length() - spanText.length();

                spannable.setSpan(new android.text.style.StyleSpan(android.graphics.Typeface.BOLD), start, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            sb.setLength(0);
            matcher.appendTail(sb);
            spannable.append(sb.toString());
            return spannable;
        }
cinta hidup
sumber
3
public static Spanned getBoldString(String textNotBoldFirst, String textToBold, String textNotBoldLast) {
    String resultant = null;

    resultant = textNotBoldFirst + " " + "<b>" + textToBold + "</b>" + " " + textNotBoldLast;

    return Html.fromHtml(resultant);

}

Coba ini. Pasti bisa membantu

Saad Bilal
sumber
3

Buat char pertama dari string yang dapat spannable saat mencari char di list / recycler like

r a vi dan ajay

sebelumnya menyoroti seperti ini tetapi saya ingin seperti di bawah ini

ravi sebuah ajay nd OR ravi dan sebuah jay

untuk ini saya mencari panjang kata jika sama dengan 1, saya memisahkan string utama menjadi kata-kata dan menghitung posisi kata mulai kemudian saya mencari kata yang dimulai dengan char.

 public static SpannableString colorString(int color, String text, String... wordsToColor) {
    SpannableString coloredString = new SpannableString(text);

    for (String word : wordsToColor) {

        Log.e("tokentoken", "-wrd len-" + word.length());
        if (word.length() !=1) {
            int startColorIndex = text.toLowerCase().indexOf(word.toLowerCase());
            int endColorIndex = startColorIndex + word.length();
            try {
                coloredString.setSpan(new ForegroundColorSpan(color), startColorIndex, endColorIndex,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            } catch (Exception e) {
                e.getMessage();
            }
        } else {
            int start = 0;

            for (String token : text.split("[\u00A0 \n]")) {
                if (token.length() > 0) {
                    start = text.indexOf(token, start);
                   // Log.e("tokentoken", "-token-" + token + "   --start--" + start);
                    char x = token.toLowerCase().charAt(0);
                    char w = word.toLowerCase().charAt(0);
                   // Log.e("tokentoken", "-w-" + w + "   --x--" + x);

                    if (x == w) {
                        // int startColorIndex = text.toLowerCase().indexOf(word.toLowerCase());
                        int endColorIndex = start + word.length();
                        try {
                            coloredString.setSpan(new ForegroundColorSpan(color), start, endColorIndex,
                                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

                        } catch (Exception e) {
                            e.getMessage();
                        }
                    }
                }
            }

        }

    }

    return coloredString;
}
Sagar
sumber
3

Saya datang ke sini untuk memberikan solusi yang lebih mutakhir, karena saya tidak puas dengan jawaban yang ada. Saya membutuhkan sesuatu yang akan berfungsi untuk teks yang diterjemahkan dan tidak memiliki kinerja yang baik menggunakan Html.fromHtml(). Jika Anda menggunakan Kotlin, berikut adalah fungsi ekstensi yang akan dengan mudah mengatur beberapa bagian teks Anda menjadi tebal . Ini berfungsi seperti penurunan harga, dan dapat diperluas untuk mendukung tag penurunan harga lainnya, jika perlu.

val yourString = "**This** is your **string**.".makePartialTextsBold()
val anotherString = getString(R.string.something).makePartialTextsBold()

/**
 * This function requires that the parts of the string that need
 * to be bolded are wrapped in ** and ** tags
 */
fun String.makePartialTextsBold(): SpannableStringBuilder {
    var copy = this
    return SpannableStringBuilder().apply {
        var setSpan = true
        var next: String
        do {
            setSpan = !setSpan
            next = if (length == 0) copy.substringBefore("**", "") else copy.substringBefore("**")
            val start = length
            append(next)
            if (setSpan) {
                setSpan(StyleSpan(Typeface.BOLD), start, length,
                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            }
            copy = copy.removePrefix(next).removePrefix("**")
        } while (copy.isNotEmpty())
    }
}
w3bshark
sumber
3

wtsang02Jawaban adalah cara terbaik untuk melakukannya, karena, Html.fromHtml ("") sekarang sudah usang. Di sini saya hanya akan sedikit meningkatkannya bagi siapa pun yang memiliki masalah dalam membuat kata pertama menjadi dinamis, tidak peduli apa ukuran kalimatnya.

Pertama mari kita membuat metode untuk mendapatkan kata pertama:

 private String getFirstWord(String input){

    for(int i = 0; i < input.length(); i++){

        if(input.charAt(i) == ' '){

            return input.substring(0, i);
        }
    }

    return input;
}

Sekarang katakanlah Anda memiliki string panjang seperti ini:

String sentence = "[email protected] want's to be your friend!"

Dan Anda ingin kalimat Anda menjadi seperti [email protected] inginkan menjadi teman Anda! Yang harus Anda lakukan adalah - dapatkan FirstWord dan dapatkan panjangnya untuk membuat FirstWord menjadi tebal, kira-kira seperti ini:

String myFirstWord = getFirstWord(sentence);
int start = 0; // bold will start at index 0
int end = myFirstWord.length(); // and will finish at whatever the length of your first word

Sekarang ikuti saja langkah wtsang02 , seperti ini:

SpannableStringBuilder fancySentence = new SpannableStringBuilder(sentence);
fancySentence.setSpan(new android.text.style.StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(fancySentence);

Dan itu dia! Sekarang Anda harus dapat menebalkan satu kata dengan ukuran berapa pun dari kalimat panjang / pendek. Semoga ini bisa membantu seseorang, selamat coding :)

Junia Montana
sumber
3

Ini adalah fungsi ekstensi Kotlin yang saya gunakan untuk ini

/**
 * Sets the specified Typeface Style on the first instance of the specified substring(s)
 * @param one or more [Pair] of [String] and [Typeface] style (e.g. BOLD, ITALIC, etc.)
 */
fun TextView.setSubstringTypeface(vararg textsToStyle: Pair<String, Int>) {
    val spannableString = SpannableString(this.text)
    for (textToStyle in textsToStyle) {
        val startIndex = this.text.toString().indexOf(textToStyle.first)
        val endIndex = startIndex + textToStyle.first.length

        if (startIndex >= 0) {
            spannableString.setSpan(
                StyleSpan(textToStyle.second),
                startIndex,
                endIndex,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            )
        }
    }
    this.setText(spannableString, TextView.BufferType.SPANNABLE)
}

Pemakaian:

text_view.text="something bold"
text_view.setSubstringTypeface(
    Pair(
        "something bold",
        Typeface.BOLD
    )
)

.

text_view.text="something bold something italic"
text_view.setSubstringTypeface(
    Pair(
        "something bold ",
        Typeface.BOLD
    ),
    Pair(
        "something italic",
        Typeface.ITALIC
    )
)
aaronmarino
sumber
2

Anda dapat menambahkan dua string secara terpisah di pembangun, salah satunya adalah spannedString, yang lainnya adalah yang biasa. Dengan cara ini Anda tidak perlu menghitung indeks.

val instructionPress = resources?.getString(R.string.settings_press)

val okText = resources?.getString(R.string.ok)
val spannableString = SpannableString(okText)

val spannableBuilder = SpannableStringBuilder()
spannableBuilder.append(instructionPress)
spannableBuilder.append(spannableString, StyleSpan(Typeface.BOLD), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

instructionText.setText(spannableBuilder,TextView.BufferType.SPANNABLE)
Евелина Дервентска
sumber
2

jika posisi teks tebal diperbaiki (mis: jika pada awal textView), maka gunakan dua textView yang berbeda dengan latar belakang yang sama. Kemudian Anda bisa membuat textStyle textView lainnya sebagai huruf tebal.

Ini akan membutuhkan memori dua kali lipat dibandingkan dengan textView tunggal tetapi kecepatan akan meningkat.

Neens
sumber
1

Saya telah membuat metode statis untuk mengatur bagian teks Tebal untuk TextView dan EditText

public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex){
        if(!contentData.isEmpty() && contentData.length() > endIndex) {
            final SpannableStringBuilder sb = new SpannableStringBuilder(contentData);

            final StyleSpan bss = new StyleSpan(Typeface.BOLD); // Span to make text bold
            final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text normal
            sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
            sb.setSpan(iss,endIndex, contentData.length()-1, Spanned.SPAN_INCLUSIVE_INCLUSIVE);

            if(mView instanceof TextView)
               ((TextView) mView).setText(sb);
            else if(mView instanceof EditText)
               ((EditText) mView).setText(sb);

        }
    }

Kode lain yang lebih khusus

  /*typeFaceStyle can be passed as 

    Typeface.NORMAL = 0;
    Typeface.BOLD = 1;
    Typeface.ITALIC = 2;
    Typeface.BOLD_ITALIC = 3;*/

    public static void boldPartOfText(View mView, String contentData, int startIndex, int endIndex,int typeFaceStyle){
        if(!contentData.isEmpty() && contentData.length() > endIndex) {
            final SpannableStringBuilder sb = new SpannableStringBuilder(contentData);

            final StyleSpan bss = new StyleSpan(typeFaceStyle); // Span to make text bold
            final StyleSpan iss = new StyleSpan(Typeface.NORMAL); //Span to make text italic
            sb.setSpan(iss, 0, startIndex, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            sb.setSpan(bss, startIndex, endIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold
            sb.setSpan(iss,endIndex,contentData.length()-1,Spanned.SPAN_INCLUSIVE_INCLUSIVE);

            if(mView instanceof TextView)
                ((TextView) mView).setText(sb);
            else if(mView instanceof EditText)
                ((EditText) mView).setText(sb);
        }
    }
Zar E Ahmer
sumber
1

Jika seseorang menggunakan Data Binding. Kita dapat mendefinisikan adaptor yang mengikat seperti ini

@BindingAdapter("html")
fun setHtml(view: TextView, html: String) {
    view.setText(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY))
}

Kemudian kita bisa menggunakannya di TextView

app:html="@{@string/bold_text}"

dimana bold_text berada

<string name="bold_text"><![CDATA[Part of text is <b>bold</b>]]></string>
logcat
sumber
Di mana Anda menulis fungsi "setHtml"?
pengembang android
developer.android.com/topic/libraries/data-binding/… Ini pada dasarnya adalah kelas apa saja, selama Anda memiliki anotasi
logcat
Oh, ini sangat aneh bagi saya. Terima kasih. Apakah Anda tahu tutorial / sampel yang bagus untuk pendatang baru dari topik ini?
pengembang android
Saya tidak tahu tutorial. Hanya google "android BindingAdapter"
logcat
1

Menemukan cara jika Anda ingin menangani pelokalan dalam berbagai bahasa, membosankan untuk dilakukan tetapi berfungsi, mari kita anggap kita menginginkan ini:

Dalam Bahasa Inggris:

Tidak ada pembayaran terdaftar

Di Spanyol:

Tidak ada hay pagos registrados

Anda harus membuat 3 string

Inggris:

<string name="start_string">There are no</string>
<string name="middle_string">payments</string>
<string name="end_string">registered.</string>
<string name="string_format" translatable="false">%1$s %2$s %3$s</string>

Orang Spanyol:

<string name="start_string">No hay</string>
<string name="middle_string">pagos</string>
<string name="end_string">registrados</string>

Sekarang Anda bisa melakukan ini:

val startSpanPosition = getString(R.string.start_string).length
val endSpanPosition = startSpanPosition + getString(R.string.middle_string).length
val mySpannableString = SpannableStringBuilder(String.format(getString(R.string.string_format),
        getString(R.string.start_string), getString(R.string.middle_string))), getString(R.string.end_string)))

mySpannableString.setSpan(StyleSpan(Typeface.BOLD), spanStartPosition, endSpanPosition, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
Jesus Almaral - Hackaprende
sumber
1

Sumber daya String Anda

<resources>
   <string name="your_string_resource_name">This is normal text<![CDATA[<b> but this is bold </b>]]> and <![CDATA[<u> but this is underline text</u>]]></string>
</resources> 

kelas java Anda

yourtextView.setText(getString(R.string.your_string_resource_name));
Yıldırım
sumber
0

Berikut ini adalah solusi lengkap saya untuk nilai String dinamis dengan pemeriksaan kasus.

/**
 * Makes a portion of String formatted in BOLD.
 *
 * @param completeString       String from which a portion needs to be extracted and formatted.<br> eg. I am BOLD.
 * @param targetStringToFormat Target String value to format. <br>eg. BOLD
 * @param matchCase Match by target character case or not. If true, BOLD != bold
 * @return A string with a portion formatted in BOLD. <br> I am <b>BOLD</b>.
 */
public static SpannableStringBuilder formatAStringPortionInBold(String completeString, String targetStringToFormat, boolean matchCase) {
    //Null complete string return empty
    if (TextUtils.isEmpty(completeString)) {
        return new SpannableStringBuilder("");
    }

    SpannableStringBuilder str = new SpannableStringBuilder(completeString);
    int start_index = 0;

    //if matchCase is true, match exact string
    if (matchCase) {
        if (TextUtils.isEmpty(targetStringToFormat) || !completeString.contains(targetStringToFormat)) {
            return str;
        }

        start_index = str.toString().indexOf(targetStringToFormat);
    } else {
        //else find in lower cases
        if (TextUtils.isEmpty(targetStringToFormat) || !completeString.toLowerCase().contains(targetStringToFormat.toLowerCase())) {
            return str;
        }

        start_index = str.toString().toLowerCase().indexOf(targetStringToFormat.toLowerCase());
    }

    int end_index = start_index + targetStringToFormat.length();
    str.setSpan(new StyleSpan(BOLD), start_index, end_index, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return str;
}

Misalnya. completeString = "Saya BOLD"

KASUS I jika *targetStringToFormat* = "bold"dan*matchCase* = true

mengembalikan "Saya BOLD" (sejak dicetak tebal! = BOLD)

KASUS II jika *targetStringToFormat* = "bold"dan*matchCase* = false

mengembalikan "I BOLD "

Untuk Mendaftar:

myTextView.setText(formatAStringPortionInBold("I am BOLD", "bold", false))

Semoga itu bisa membantu!

sud007
sumber