如何在运行时将部分文本Bold在android中?

时间:2012-06-11 12:09:23

标签: android android-listview

我的应用中的ListView有很多字符串元素,例如nameexperiencedate 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>

我的代码设置ListView项目的TextView:

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

9 个答案:

答案 0 :(得分:191)

假设您有一个名为TextView的{​​{1}}。然后,您将使用以下代码:

etx

答案 1 :(得分:18)

基于Imran Rana的回答,如果您需要将include_once(): Failed opening '/path/to/symfony/app/cache/local__pro_/twig/fb/fb29d5e893de121cf8bbf19b167578b6777f301a00055526687e21c.php' for inclusion (include_path='.:/usr/share/php:/usr/share/pear')应用于多个StyleSpan,并且支持多种语言(其中索引是可变的),这里是一个通用的,可重用的方法:

TextView

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

结果:

欢迎使用 CompanyName

答案 2 :(得分:7)

这里提供的答案是正确的,但不能在循环中调用,因为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; } 会创建一个粗体,只需在父级中移动它。

在我的情况下(显示搜索结果),我需要使所有搜索关键字的所有实例都显示为粗体。这就是我所做的:

var Sex;
var Users;

function GetSex() {
        $.ajax({
            url: '/SEX/GetAllSex/',
            success: function (data) {
                Sex = data;
                console.log(data);
            }
        });
     }

     function GetUsers() {
         var Pistas = null;
         $.ajax({
             url: '/Users/GetAllUsers/',
             success: function (data) {
                 Users = data;
                 console.log(data)

             }
         });
     }

请记住,如果一个关键字是另一个关键字的子字符串,则上面的代码不够智能,不能跳过双重粗体。例如,如果您在“在海洋中钓鱼”中搜索“Fish fi”,它将使“fish”加粗一次那么“fi”部分。好处是虽然效率低且有点不受欢迎,但它不会有视觉上的缺陷,因为你的显示结果看起来仍然像

fi 麦粒肿海

es

答案 3 :(得分:2)

如果您不确切地知道文本部分之前文本的长度是否要粗体,或者您甚至不知道文本的粗体长度,您可以轻松使用HTML标签,例如以下内容:

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

答案 4 :(得分:2)

您可以使用Kotlin和buildSpannedString的{​​{1}}扩展功能

core-ktx

答案 5 :(得分:0)

将受欢迎者的答案扩展到支持案例和变音符号不敏感。

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

答案 6 :(得分:0)

如果使用@ srings / your_string批注,请访问strings.xml文件,并在所需文本部分使用<b></b>标签。

示例:

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

答案 7 :(得分:0)

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

在string.xml文件中使用“ b”标记。
斜体字“ i”和下划线“ u”也是如此。

答案 8 :(得分:-1)

我建议将strings.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) ));