2012-06-11 15 views
50

A ListView w mojej aplikacji zawiera wiele elementów ciągów, takich jak name, experience, date of joining itp. Po prostu chcę pogrubić name. Wszystkie elementy ciągów będą w pojedynczej TextView.Jak zrobić część tekstu pogrubioną w Androidzie w czasie wykonywania?

mój XML:

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

Mój kod, aby ustawić TextView elementu ListView:

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

Odpowiedz

150

że masz TextView nazywa etx. Można by następnie użyć następującego kodu:

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

+0

tak to worked..thank ty – Housefly

+0

to będzie działać z niestandardowych czcionek? – Siavash

+0

@Siavash - Działa z niestandardowymi czcionkami. – Dimmy3

-3

polecam użyć pliku strings.xml z CDATA

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

Następnie w pliku Java:

TextView myTextView = (TextView) this.findViewById(R.id.myTextView); 
myTextView.setText(Html.fromHtml(getResources().getString(R.string.mystring))); 
10

oparciu o Odpowiedź Imrana Rany, tutaj jest ogólna, wielokrotnego użytku metoda, jeśli chcesz zastosować StyleSpan s do kilku TextView s, ze wsparciem dla wielu języków (gdzie indeksy są zmienne):

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

używać go w Activity tak:

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

Wynik:

Zapraszamy do NazwaFirmy

+0

Ten jest genialny !!! – ken

6

Odpowiedzi, które tutaj są poprawne, ale nie można nazwać w pętli, ponieważ obiekt StyleSpan jest pojedynczym przyległe rozpiętość (nie jest to styl, który można zastosować do wielu przęseł). Wielokrotne wywołanie setSpan z tym samym pogrubieniem StyleSpan spowodowałoby utworzenie pogrubionej rozpiętości i po prostu przesunięcie w obszarze nadrzędnym.

W moim przypadku (wyświetlając wyniki wyszukiwania) musiałem ustawić pogrubienie wszystkich wystąpień wszystkich słów kluczowych wyszukiwania. To, co zrobiłem:

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

Należy pamiętać, że powyższy kod nie jest wystarczająco silny, aby przejść dwukrotnie pogrubienie jeśli jedno słowo kluczowe jest podciąg od drugiej.Na przykład, jeśli szukać „Fish fi” wewnątrz „ryby w Morzu fisty” uczyni to „fish” bold raz i wtedy „fi” porcji. Dobrą rzeczą jest to, że podczas gdy nieefektywne i nieco niepożądana, to nie będzie miało wadę wizualny jak Twój wyświetlany wynik będzie nadal wyglądać

Ryby es w fi chlewie Morza

+0

Jest to najlepsze rozwiązanie, które ma charakter ogólny i ma zastosowanie we wszystkich przypadkach. –

0

Rozszerzanie odpowiedź Frieder za do obsługi niewrażliwości na przypadki i znaki diakrytyczne.

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

jeśli nie wiesz dokładnie długość tekstu sprzed części tekstu, który chcesz dokonać Bold, albo nawet nie wiesz długość tekstu, który zostanie Bold, można łatwo korzystać znaczniki HTML jak następuje:

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