ListView
W mojej ofercie posiada wiele elementów, takich jak sznurek name
, experience
, date of joining
, itd. Po prostu chcę, aby name
pogrubione. Wszystkie elementy string będą w jednym TextView
.
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);
android
android-listview
Mucha
źródło
źródło
Odpowiedzi:
Powiedz, że masz
TextView
telefonetx
. Następnie użyłbyś 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);
źródło
var bss = new StyleSpan(Android.Graphics.TypefaceStyle.Bold);
etx.TextFormatted = sb;
W oparciu o odpowiedź Imrana Rany, oto ogólna metoda wielokrotnego użytku, jeśli chcesz zastosować
StyleSpan
s do kilkuTextView
, z obsługą 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żyj go w
Activity
taki sposób:@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:
Witamy w CompanyName
źródło
Podane tutaj odpowiedzi są poprawne, ale nie można ich wywołać w pętli, ponieważ
StyleSpan
obiekt jest pojedynczym ciągłym zakresem (nie jest to styl, który można zastosować do wielu zakresów). WywołaniesetSpan
wiele razy z tym samym pogrubieniemStyleSpan
utworzyłoby jeden pogrubiony zakres i po prostu przesunąłby go w zakresie nadrzędnym.W moim przypadku (przy wyświetlaniu wyników wyszukiwania) potrzebowałem pogrubienia wszystkich wystąpień wszystkich wyszukiwanych słów kluczowych. Oto 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; }
Pamiętaj, że powyższy kod nie jest wystarczająco inteligentny, aby pominąć podwójne pogrubienie, jeśli jedno słowo kluczowe jest podłańcuchem drugiego. Na przykład, jeśli szukasz „Fish fi” wewnątrz „ryby w Morzu fisty” uczyni to „ryby” bold raz, a następnie „fi” porcji. Dobrą rzeczą jest to, że chociaż nieefektywny i trochę niepożądany, nie będzie miał wad wizualnych, ponieważ wyświetlany wynik nadal będzie wyglądał
Ryby es w fi Morza chlewie
źródło
Możesz to zrobić za pomocą Kotlina i
buildSpannedString
funkcji rozszerzenia zcore-ktx
holder.textView.text = buildSpannedString { bold { append("$name\n") } append("$experience $dateOfJoining") }
źródło
jeśli nie znasz dokładnie długości tekstu przed fragmentem tekstu, który chcesz pogrubić, lub nawet nie wiesz, jaka długość tekstu ma być pogrubiona, możesz łatwo użyć tagów HTML, takich jak następujące:
yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));
źródło
Rozszerzenie odpowiedzi Friedera na wsparcie przypadku i niewrażliwość znaków diakrytycznych.
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); }
źródło
Jeśli używasz adnotacji @ srings / your_string, przejdź do pliku strings.xml i użyj
<b></b>
znacznika w części tekstu, którą chcesz.Przykład:
<string><b>Bold Text</b><i>italic</i>Normal Text</string>
źródło
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) ));
źródło