Çalışma zamanında android'de Kalın metnin bir parçası nasıl yapılır?


103

Bir ListViewbenim uygulamada gibi birçok dize öğesi vardır name, experience, date of joiningvb Sadece yapmak istiyorum namekalın. Tüm dize elemanları tek bir içinde olacaktır TextView.

XML'im:

<ImageView
    android:id="@+id/logo"
    android:layout_width="55dp"
    android:layout_height="55dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginTop="15dp" >
</ImageView>

<TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/logo"
    android:padding="5dp"
    android:textSize="12dp" >
</TextView>

ListView öğesinin Metin Görünümünü ayarlamak için kodum:

holder.text.setText(name + "\n" + expirience + " " + dateOfJoininf);

Yanıtlar:


240

Eğer bir olduğunu varsayalım TextViewdenir etx. Daha sonra aşağıdaki kodu kullanırsınız:

final SpannableStringBuilder sb = new SpannableStringBuilder("HELLOO");

final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Span to make text bold
final StyleSpan iss = new StyleSpan(android.graphics.Typeface.ITALIC); //Span to make text italic
sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make first 4 characters Bold 
sb.setSpan(iss, 4, 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make last 2 characters Italic

etx.setText(sb);


2
Xamarin için şunu kullanınvar bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold);
Elisabeth

Xamarin içinetx.TextFormatted = sb;
Darius

29

Imran Rana'nın cevabına dayanarak, birden çok dil desteğiyle (indekslerin değişken olduğu yerlerde) StyleSpanbirkaç TextViews'ye birden fazla s uygulamanız gerekiyorsa, burada genel, yeniden kullanılabilir bir yöntem verilmiştir :

void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style) {
    SpannableStringBuilder sb = new SpannableStringBuilder(text);
    int start = text.indexOf(spanText);
    int end = start + spanText.length();
    sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    textView.setText(sb);
}

Şöyle kullanın Activity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    StyleSpan boldStyle = new StyleSpan(Typeface.BOLD);
    setTextWithSpan((TextView) findViewById(R.id.welcome_text),
        getString(R.string.welcome_text),
        getString(R.string.welcome_text_bold),
        boldStyle);

    // ...
}

strings.xml

<string name="welcome_text">Welcome to CompanyName</string>
<string name="welcome_text_bold">CompanyName</string>

Sonuç:

CompanyName'e hoş geldiniz


13

Burada sağlanan yanıtlar doğrudur, ancak StyleSpannesne tek bir bitişik aralık olduğundan (birden çok yayılmaya uygulanabilen bir stil değil) döngüde çağrılamaz. setSpanAynı kalın harfle birden çok kez aramak , bir kalın aralıkStyleSpan oluşturacaktır ve onu ana aralıkta hareket ettirir.

Benim durumumda (arama sonuçlarını görüntüleyerek), tüm arama anahtar kelimelerinin tüm örneklerini kalın görünmesini sağlamam gerekiyordu. Ben de öyle yaptım:

private static SpannableStringBuilder emboldenKeywords(final String text,
                                                       final String[] searchKeywords) {
    // searching in the lower case text to make sure we catch all cases
    final String loweredMasterText = text.toLowerCase(Locale.ENGLISH);
    final SpannableStringBuilder span = new SpannableStringBuilder(text);

    // for each keyword
    for (final String keyword : searchKeywords) {
        // lower the keyword to catch both lower and upper case chars
        final String loweredKeyword = keyword.toLowerCase(Locale.ENGLISH);

        // start at the beginning of the master text
        int offset = 0;
        int start;
        final int len = keyword.length(); // let's calculate this outside the 'while'

        while ((start = loweredMasterText.indexOf(loweredKeyword, offset)) >= 0) {
            // make it bold
            span.setSpan(new StyleSpan(Typeface.BOLD), start, start+len, SPAN_INCLUSIVE_INCLUSIVE);
            // move your offset pointer 
            offset = start + len;
        }
    }

    // put it in your TextView and smoke it!
    return span;
}

Yukarıdaki kodun, bir anahtar kelime diğerinin alt dizesi ise çift kalın yazmayı atlayacak kadar akıllı olmadığını unutmayın. Örneğin, "Yumruklu Denizdeki Balıklar " içinde "Balık fi" yi ararsanız , "balık" ı bir kez kalın, sonra da "fi" kısmını yapar. İşin iyi yanı, verimsiz ve biraz istenmeyen olsa da, görüntülenen sonucunuz yine de görüneceği için görsel bir dezavantajı olmayacak

Balık içinde es fi arpacık Denizi



8

Kotlin ve buildSpannedStringuzantı işlevini kullanarak yapabilirsiniz .core-ktx

 holder.textView.text = buildSpannedString {
        bold { append("$name\n") }
        append("$experience $dateOfJoining")
 }

5

Kalın yapmak istediğiniz metin bölümünden önceki metnin uzunluğunu tam olarak bilmiyorsanız veya kalın olacak metnin uzunluğunu bilmiyorsanız bile, aşağıdaki gibi HTML etiketlerini kolayca kullanabilirsiniz:

yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));

0

Frieder'in cevabını büyük / küçük harf ve aksan duyarsızlığını desteklemek için genişletmek.

public static String stripDiacritics(String s) {
        s = Normalizer.normalize(s, Normalizer.Form.NFD);
        s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
        return s;
}

public static void setTextWithSpan(TextView textView, String text, String spanText, StyleSpan style, boolean caseDiacriticsInsensitive) {
        SpannableStringBuilder sb = new SpannableStringBuilder(text);
        int start;
        if (caseDiacriticsInsensitive) {
            start = stripDiacritics(text).toLowerCase(Locale.US).indexOf(stripDiacritics(spanText).toLowerCase(Locale.US));
        } else {
            start = text.indexOf(spanText);
        }
        int end = start + spanText.length();
        if (start > -1)
            sb.setSpan(style, start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        textView.setText(sb);
    }

0

@ Srings / your_string ek açıklamasını kullanıyorsanız, strings.xml dosyasına erişin ve <b></b> istediğiniz metnin bölümünde etiketi .

Misal:

    <string><b>Bold Text</b><i>italic</i>Normal Text</string>

0
<string name="My_Name">Given name is <b>Not Right</b>Please try again </string>

string.xml dosyasında "b" etiketini kullanın.
İtalik "i" ve Altı Çizili "u" için de.


-1

CDATA ile strings.xml dosyasını kullanmanızı öneririm

<string name="mystring"><![CDATA[ <b>Hello</b> <i>World</i> ]]></string>

Sonra java dosyasında:

TextView myTextView = (TextView) this.findViewById(R.id.myTextView);
myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));
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.