Как сделать часть текста жирным шрифтом в Android во время выполнения?
A ListView в моем приложении есть много строковых элементов, таких как name,experience,date of joining и т. д. Я просто хочу сделать name смелый. Все строковые элементы будут в одном TextView.
мой 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>
мой код для установки TextView элемента ListView:
holder.text.setText(name + "n" + expirience + " " + dateOfJoininf);
6 ответов:
скажем, у вас есть
TextViewпод названиемetx. Затем вы будете использовать следующий код: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);
на основе ответа Имрана раны, вот общий, многоразовый метод, если вам нужно применить
StyleSpans на несколькоTextViews, с поддержкой нескольких языков (где индексы являются переменными):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); }используйте его в
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>
результат:
Добро пожаловать CompanyName
ответы, представленные здесь, являются правильными, но не могут быть вызваны в цикле, потому что
StyleSpanобъект-это один непрерывный промежуток (не стиль, который может быть применен к нескольким промежуткам). ЗвонюsetSpanнесколько раз с тем же жирнымStyleSpanсоздать один жирный пролет и просто переместите его в родительский промежуток.в моем случае (отображение результатов поиска) мне нужно было сделать все экземпляры всех ключевых слов поиска полужирными. Это то, что я сделал:
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; }имейте в виду, что приведенный выше код недостаточно умен, чтобы пропустить двойной жирный шрифт, если одно ключевое слово является подстрокой другого. Например, если вы ищете "Fish fi" внутри "рыбы в кулачном море" это сделает "рыба" жирный раз, а затем "интернет" часть. Хорошо, что в то время как неэффективно и немного нежелательно, он не будет иметь визуального недостатка, как ваш отображаемый результат будет по-прежнему выглядеть как
Рыбное es в fisty Sea
расширение ответа Фридера для поддержки нечувствительности к регистру и диакритике.
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); }
Если вы не знаете точно длину текста перед текстовой частью, которую вы хотите сделать полужирным, или даже вы не знаете длину текста, чтобы быть полужирным, вы можете легко использовать HTML-теги, такие как:
yourTextView.setText(Html.fromHtml("text before " + "<font><b>" + "text to be Bold" + "</b></font>" + " text after"));
Я рекомендую использовать строки.xml-файл с CDATA
<string name="mystring"><![CDATA[ <b>Hello</b> <i>World</i> ]]></string>затем в файле java:
TextView myTextView = (TextView) this.findViewById(R.id.myTextView); myTextView.setText(Html.fromHtml( getResources().getString(R.string.mystring) ));
Comments