TextView BOLD'da belirli bir metin nasıl yapılır


253

TextView üzerinde belirli bir metnin kalın hale nasıl getirileceğini bilmiyorum.

bunun gibi

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

Çıktı şöyle olmasını istiyorum:

1111 neil

idve nameben veritabanından değeri almış değişkenler, ve ben idkalın yapmak istiyorum , ama sadece idböylece nameetkilenmez, nasıl bunu yapmak için hiçbir fikrim yok.



4 yol - TextView kalın yazı tipine özgü dize - Kesinlikle size yardımcı olur.
c49

Yanıtlar:


380

Dizenizi HTML olarak oluşturun ve ayarlayın:

String sourceString = "<b>" + id + "</b> " + name; 
mytextview.setText(Html.fromHtml(sourceString));

5
FromHtml (sourceString) API 24'te kullanımdan kaldırıldığı için, sonraki kodu kullanmanız gerekir: Spanned durationSpanned; if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {durationSpanned = Html.fromHtml (durationFormatted, Html.FROM_HTML_MODE_LEGACY); } else {durationSpanned = Html.fromHtml (durationFormatted); }
Mladen Rakonjac

2
Uygulamanızı yerelleştiriyorsanız işe yarayacak tek seçenek budur.
howettl

Bu iyi bir çözüm ama ben <ve> wtsang02 çözümü için daha uygun olduğunu
öğrendim

<String.format kullanırsanız, burada açıklandığı gibi, braketten de kaçarsanız UNLESS ile çalışmaz .
Yusuf X

5
Html.fromHtml()şu anda kullanımdan kaldırıldı
Birisi

384

Html.fromHtml () yöntemini kullanabilmenize rağmen , SpannableStringBuilder olan daha yerel bir yaklaşım kullanabilirsiniz, ancak bu gönderi helful olabilir.

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

Bu yanıt işe yaramazsa, metninizi eklenebilir dize ile eklemeyi deneyin: mSpannable.append (yourremainingtext);
Gowtham Kumar

11
Google'dan önceden bilgisi olmayan kişiler için: INT_START / INT_END, kalın yazı tipinin başlayıp bitmesi gereken konumdur.
Spotlight

2
Kaynak dizgiyi değiştirmeden yalnızca bir işaretleme uygulamanız gerekiyorsa, SpannableString sınıfını kullanmanız daha iyi olur
Buckstabue

26
Kopyanızı yerelleştirmeniz gerekiyorsa bu tamamen kırılacaktır. INT_START ve INT_END farklı yerelleştirmelerde farklı konumlar olacaktır.
howettl

5
Şüphe duyduğunuzda kodun ne yaptığını anlamaya çalışın. İnt start, aralığın başlangıç ​​dizini olan tanımladığınız bir sayıdır. Başlangıç ​​için 0, dize. (). Boyut () için deneyin.
wtsang02

86

İlk olarak: Raghav Sood'un cevabındaki yavaş performans kodunu kullanma konusunda endişelenmenize gerek yok .

İkincisi: Kotlin'i kullanırken w3bshark'ın cevabı tarafından sağlanan bir genişletme işlevi yazmanıza gerek yoktur .

Finnaly: Tek yapmanız gereken Google'dan Kotlin android-ktx kütüphanesini kullanmaktır ( daha fazla bilgi ve projenize nasıl ekleyeceğinizi öğrenmek için buraya bakın ):

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

Yapımcı: 1111 neil


GÜNCELLEME:

Çünkü başka birine yardımcı olabileceğini ve buraya ne kadar ileri gidebileceğinizi göstermenin daha fazla kullanım örneği olduğunu düşünüyorum.

  • Bazı bölümleri mavi ve italik olan bir metin görüntülemeniz gerektiğinde:

    val myCustomizedString = SpannableStringBuilder()
        .color(blueColor, { append("A blue text ") })
        .append("showing that ")
        .italic{ append("it is painless") }
    
  • Hem kalın hem de italik olarak bir metin görüntülemeniz gerektiğinde:

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

Kısacası, bold, append, colorve italicuzatma fonksiyonları için vardır SpannableStringBuilder. Resmi belgelerde , diğer olasılıkları düşünebileceğiniz başka bir uzantı işlevi görebilirsiniz .


Bu harika bir şey ve bence dizelerle ilgili her cevabın çevirileri dikkate alması gerektiğini düşünüyorum. Cümlelerdeki kelimeler, bazı dillerde tamamen farklı şekilde sıralanabilir ve yapılandırılabilir, bu nedenle böyle durumlarda bazı durumlarda her zaman geçerli değildir. Ayrıca XML'deki miktar dizeleri gibi şeyler için ideal değildir.
Edward van Raak

1
@CoolMind Android KTX'i kullanamazsınız. Github.com/android/android-ktx adresinden nasıl hata ayıklayacağınız, özellik önerisinde bulunabileceğiniz veya bu kütüphaneye nasıl katkıda bulunabileceğiniz hakkında bilgi bulabilirsiniz. Yani, hala geçerli bir referans. Cevabımı, kütüphane ve projenizde nasıl kullanacağınız hakkında daha fazla bilgi içerecek şekilde güncelledim.
Filipe Brito

1
Bu adama bu modern çözüm ve kaynak için bir madalya verin !! Teşekkürler!!!
Sjd

37

Seçilen cevabın tatmin edici bir sonuç sağlamadığını düşündüm. 2 dizge alan kendi fonksiyonumu yazdım; Tam metin ve metnin kalın yapmak istediğiniz kısmı.

Kalın yazılmış 'text' öğesinden 'textToBold' ile bir SpannableStringBuilder döndürür.

Bir alt dize, etiketleri sarmadan kalın yapma yeteneğini yararlı buluyorum.

    /**
     * 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;
  }

Bunu kodda nasıl kullanacağınıza dair bir örnek verebilir misiniz?
Mikro

2
@MicroR İki Dize iletmeniz gerekir, ikinci Dize, birincisinde bulunan metnin bir bölümü olmalıdır. örn. makeSectionOfTextBold ("Bu harika bir metindir.", "harika").
Leon

1
if ifadenizi if ile değiştirmelisiniz (textToBold! = null &&! textToBold.isEmpty ())
Arda Kara

2
Bu işlev, alt dizenin tam metinde birden çok kez oluşmasını beklemez. Örneğin, "Kullanıcı adım" adında "2." ad "kalın yapamaz.
Jadamec

1
Daha sonra bu yöntem aslında makeAllBold (text, textToBold) olarak adlandırılmalıdır.
wtsang02

30

Wtsang02'nin dediği gibi, HTML kullanmak pahalı bir ek yüktür. Sadece yerel çözümü kullanın. Dizeyi değiştirmeniz gerekmiyorsa, SpannableStringBuilder değil, SpannableString kullanın.

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

23

XML dizesini kullanmak isterseniz, şöyle bir şey yapabilirsiniz:

strings.xml ("CDATA" bölümü önemlidir, aksi takdirde çalışmaz)

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

düzen dosyası

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

kod

textView.text = HtmlCompat.fromHtml(getString(R.string.test), HtmlCompat.FROM_HTML_MODE_LEGACY)

Bu benim için çalışıyor <string name="test"><b>text bold</b> other text</string>. Ben <![CDATA[
sara

@sara Q ile Pixel 2 üzerinde tekrar test edildi. Burada Kotlin ile nasıl çalıştığını güncelledim. Lütfen tekrar deneyin.
android geliştirici

Özel yazı tipleri kullanıyorsanız bu kabul edilebilir cevaptır. Yaradan için Kudus.
Raghul Sugathan

12

Basit, örneğin belirtilen metni böyle kapatır <b>"your text here:"</b>

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

sonuç: Merkez: Mooresville, Kuzey Karolina, ABD


Bu yalnızca dize xml'den kullanılıyorsa çalışır. Bu dize programlı olarak çağrılırsa, html kodlaması çıkarılır.
Starwave

11

Kotlin kullanıyorsanız, bunu yapmak core-ktxiçin etki alanına özgü bir dil (DSL) sağladığı için kullanmak daha da kolaylaşır :

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

Sağladığı diğer seçenekler:

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

Sonunda şunları yapabilirsiniz:

textView.text = string

10

Birden çok metni kalın yapmak istiyorsanız daha iyi bir çözüm. Eitan'ın kodunu geliştirdim. teşekkürler 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;
}

8

@ Mladj0ni'nin cevabına dayanarak, çalışmak için aşağıdaki kodu aldım. Sorun, String.format kullanırsanız , html biçimlendirmesini kaldırır, böylece strings.xml dosyasındaki köşeli parantez sembollerinden kaçmanız gerekir:

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

SpannableStringBuilder'dan daha basit. Performansa gelince, sadece bir dize görüntülüyorsanız, kullanıcı onu ayrıştırmak için ekstra milisaniyeyi fark etmez.

Buradaki belgelere bakın .


Burun içi uygulama için teşekkürler; b> ... & lt; / b>
oxied

4

Metninizin bir kısmını kalın olacak şekilde ayarlamak için bu kodu kullanabilirsiniz. Kalın html etiketleri arasında ne varsa, onu kalın yapacaktır.

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

3
public static Spanned getBoldString(String textNotBoldFirst, String textToBold, String textNotBoldLast) {
    String resultant = null;

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

    return Html.fromHtml(resultant);

}

Bunu dene. Kesinlikle yardımcı olabilir


3

Listedeki char / recycler gibi arama yaparken dizenin ilk karakterini yanılabilir yapın

r, bir Vi ve Ajay

Önceden böyle vurgulama ama aşağıdaki gibi olmak istedim

ravi ve nd ajay VEYA ravi ve bir jay

Bunun için 1'e eşitse kelime uzunluğunu aradım, ana dizeyi kelimelere ayırdım ve kelime başlangıç ​​pozisyonunu hesapladım, sonra char ile başlayan kelimeyi aradım.

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

3

Buraya daha güncel bir çözüm sunmak için geldim, çünkü mevcut cevaplardan memnun değildim. Tercüme edilmiş metinler için işe yarayacak bir şeylere ihtiyacım vardı ve performans ispatı yoktu Html.fromHtml(). Kotlin kullanıyorsanız, metninizin birden çok parçasını kolayca kalın olarak ayarlayacak bir uzantı işlevi . Bu, Markdown gibi çalışır ve gerekirse diğer Markdown etiketlerini desteklemek için genişletilebilir.

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

3

Html.fromHtml ("") artık kullanımdan kaldırıldığı için wtsang02 yanıtı bu konuda en iyi yoldur. Burada, cümlenin boyutu ne olursa olsun, ilk kelimeyi dinamik olarak cesur hale getirmekte sorun yaşayan herkes için biraz geliştireceğim.

İlk önce ilk kelimeyi almak için bir yöntem oluşturalım:

 private String getFirstWord(String input){

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

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

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

    return input;
}

Şimdi bunun gibi uzun bir dizeniz olduğunu varsayalım:

String sentence = "friendsAwesomeName@gmail.com want's to be your friend!"

Ve sen cümle gibi olmak istiyorum yourAwesomeName@gmail.com senin arkadaşın olmak istiyorum! Tek yapmanız gereken, ilkWord'u almak ve ilkWord'u cesur hale getirmek için uzunluğunu elde etmek, şöyle bir şey:

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

Şimdi wtsang02'nin adımlarını takip et , şöyle:

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

Ve bu kadar! Artık uzun / kısa cümlenin herhangi bir büyüklüğünde bir kelimeyi cesurca yazabilmelisiniz. Birisine yardımcı olacağını umuyoruz, mutlu kodlama :)


3

Bunun için kullandığım Kotlin genişletme işlevi

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

Kullanımı:

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

2

Oluşturucuya iki dizeyi ayrı olarak ekleyebilirsiniz, bunlardan biri spanSString, diğeri normal bir dizedir.Bu şekilde dizinleri hesaplamanız gerekmez.

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)

2

kalın metnin konumu sabitse (ör: textView başlangıcındaysa), aynı arka plana sahip iki farklı textView kullanın. Sonra diğer textView'ın textStyle'ını kalın olarak yapabilirsiniz.

Bu, tek bir textView ile karşılaştırıldığında iki kat bellek gerektirir, ancak hız artar.


1

TextView ve EditText için Kalın metnin bir kısmını ayarlamak için statik bir yöntem oluşturduk

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

        }
    }

Başka bir özelleştirilmiş kod

  /*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);
        }
    }

1

Birisi Veri Bağlama kullanıyorsa. Bağlama adaptörünü şöyle tanımlayabiliriz

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

Sonra bir TextView üzerinde kullanabiliriz

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

burada bold_text

<string name="bold_text"><![CDATA[Part of text is <b>bold</b>]]></string>

"SetHtml" fonksiyonunu nereye yazıyorsunuz?
android geliştirici

developer.android.com/topic/libraries/data-binding/… Ek açıklamanız olduğu sürece temelde herhangi bir sınıf
logcat

Ah bu benim için çok garip. Teşekkür ederim. Belki de bu konunun yeni gelenleri için güzel bir öğretici / örnek biliyor musunuz?
android geliştirici

Öğreticileri bilmiyorum. Sadece "android BindingAdapter" google
logcat

1

Yerelleştirmeyi birden çok dilde ele almak istediğinizde bir yol buldum, bunu yapmak sıkıcı ama işe yarıyor, diyelim ki bunu istiyoruz:

İngilizcede:

Kayıtlı ödeme yok

İspanyolca'da:

Hayır saman pagos kayıtları

3 dize oluşturmalısınız

İngilizce:

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

İspanyol:

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

Şimdi bunu yapabilirsiniz:

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)

1

String kaynağınız

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

java dersin

yourtextView.setText(getString(R.string.your_string_resource_name));

0

Burada, vaka kontrolü ile dinamik String değerleri için eksiksiz çözümüm var.

/**
 * 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;
}

Örneğin. completeString = "Ben KALIN"

VAKA ben eğer *targetStringToFormat* = "bold"ve*matchCase* = true

"BOLD I BOLD" döndürür (kalın olduğu için! = BOLD)

DURUM II ise *targetStringToFormat* = "bold"ve*matchCase* = false

"Ben cesurum " döndürür

Başvurmak:

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

Umarım yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.