Soru Nasıl çalışma zamanında android Bold metin parçası yapmak için?


bir ListView benim uygulamasında gibi birçok dize elemanları var name, experience, date of joiningvb. sadece yapmak istiyorum name cesur. Tüm dize öğeleri tek bir TextView.

benim 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 TextView değerini ayarlamak için kodum:

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

55
2018-06-11 12:09


Menşei




Cevaplar:


Senin bir tane olduğunu söyle TextView denilen 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);


164
2018-06-11 12:11



evet işe yaradı - Housefly
Bu özel yazı tipleri ile çalışacak mı? - Siavash
@Siavash - Özel yazı tipleri ile çalışır. - Dimmy3
Xamarin için böyle kullan var bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold); - Elisabeth


Imran Rana'nın cevabına dayanarak, başvurmanız gerekirse, genel, tekrar kullanılabilir bir yöntemdir. StyleSpanbirkaçına s TextViewBirden çok dil desteği ile (indeksler değişkendir):

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

Onu bir Activity öyle:

@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ç:

Hoşgeldiniz Şirket Adı


15
2018-01-14 14:16



Bu muhteşem! - ken


Burada verilen cevaplar doğrudur, ancak bir döngüde çağrılmaz çünkü StyleSpan nesne, tek bitişik bir açıklıktır (birden çok yayına uygulanabilecek bir stil değildir). çağrı setSpan Aynı cesur ile birden çok kez StyleSpan Yaratacaktı bir cesur açıklık ve sadece üst açıklıkta dolaşın.

Benim durumumda (arama sonuçları gösteriliyor), tüm arama anahtar kelimelerinin tüm örneklerinin kalın gösterilmesini sağladım. Yaptığım şey buydu:

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 kelimenin diğerinin alt dizesi olması durumunda çift-kodlamayı atlayacak kadar akıllı olmadığını unutmayın. Örneğin, arama yaparsanız "Balık fi" içeride "Fisty Denizi'nde Balıklar" o yapacak "balık" bir kez kalın ve sonra "Fi" bölümü. İyi olan şey, verimsiz ve biraz istenmeyen olsa da, görüntülenen sonucun hala şöyle görüneceğinden, görsel bir dezavantajı olmayacaktır.

Balıkiçinde es fiarpacık deniz


6
2017-11-04 00:43



Bu, her durumda genel ve geçerli olan en iyi olanıdır. - Binil Jacob


Vaka ve aksaklık duyarsızlığını desteklemek için Frieder'ın yanıtını 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
2018-01-10 11:56





Kalınlaştırmak istediğiniz metin bölümünden önce metnin uzunluğunu tam olarak bilmiyorsanız veya hatta Kalın yazılacak metnin uzunluğunu bilmiyorsanız, HTML etiketlerini aşağıdaki gibi kolayca kullanabilirsiniz:

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

0
2017-07-11 06:31





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

-3
2018-03-07 00:20