การเน้นสีข้อความโดยใช้ Html.fromHtml () ใน Android?


84

ฉันกำลังพัฒนาแอปพลิเคชันซึ่งจะมีหน้าจอค้นหาที่ผู้ใช้สามารถค้นหาคำหลักที่ต้องการได้และควรเน้นคำหลักนั้น ฉันพบเมธอด Html.fromHtml

แต่ฉันอยากรู้ว่ามันเป็นวิธีที่เหมาะสมในการทำหรือไม่

โปรดแจ้งให้เราทราบความคิดเห็นของคุณเกี่ยวกับเรื่องนี้


ดูตัวอย่างการทำงาน javatechig.com/2013/04/07/how-to-display-html-in-android-view
Nilanchal

คำตอบ:


198

หรือง่ายกว่าการจัดการกับSpannables ด้วยตนเองเนื่องจากคุณไม่ได้บอกว่าคุณต้องการให้พื้นหลังถูกไฮไลต์เพียงแค่ข้อความ:

String styledText = "This is <font color='red'>simple</font>.";
textView.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE);

8
เป็นที่น่าสังเกตว่า Html.fromHtml ช้ากว่า SpannableString เนื่องจากเกี่ยวข้องกับการแยกวิเคราะห์ แต่สำหรับข้อความสั้น ๆ มันไม่สำคัญ
Michał K

มีปรากฏเป็นวิธีการแก้ปัญหาอื่นที่เชื่อมโยง ดูคำตอบโดย Legend
Kenneth Evans

1
เช่นเดียวกับความคิดเห็นฉันพบว่าฉันไม่จำเป็นต้องผ่าน TextView.BufferType.SPANNABLE และมันยังใช้งานได้ ขอบคุณ!
James

คุณรู้จักโปรแกรมแก้ไข html สำหรับการจัดเรียงข้อความยาวสำหรับ Android หรือไม่ ตัวอย่างเช่นฉันพยายามใช้ไซต์นี้ ( html.am/html-editors/html-text-editor.cfm ) แต่ถ้าฉันต้องการดูแหล่งที่มามันจะส่งคืนสี<span style="color:#ff0000;">เพื่อให้ Android ไม่เปลี่ยนสี
mehmet

@mehmet คุณสามารถทำได้เพียงแค่ค้นหาและแทนที่เพื่อเปลี่ยนแท็ก <span> เป็นแท็ก <font> ด้วยแอตทริบิวต์ "color"
Christopher Orr

36

การใช้ค่าสีจากทรัพยากร xml:

int labelColor = getResources().getColor(R.color.label_color);
String сolorString = String.format("%X", labelColor).substring(2); // !!strip alpha value!!

Html.fromHtml(String.format("<font color=\"#%s\">text</font>", сolorString), TextView.BufferType.SPANNABLE); 

ทำได้ดีมาก มีประโยชน์ในการใช้สีจากทรัพยากรแอปของคุณ
speedynomads

ฉันต้องการเน้นบรรทัดที่สองโดยที่คุณซับสีฐานสิบหก: ค่าอัลฟาจะทำให้การตั้งค่าสีไม่ถูกต้อง! อย่าลืม!
marcolav

12

ซึ่งสามารถทำได้โดยใช้ Spannable String คุณจะต้องนำเข้าสิ่งต่อไปนี้

import android.text.SpannableString; 
import android.text.style.BackgroundColorSpan; 
import android.text.style.StyleSpan;

จากนั้นคุณสามารถเปลี่ยนพื้นหลังของข้อความโดยใช้สิ่งต่อไปนี้:

TextView text = (TextView) findViewById(R.id.text_login);
text.setText("");
text.append("Add all your funky text in here");
Spannable sText = (Spannable) text.getText();
sText.setSpan(new BackgroundColorSpan(Color.RED), 1, 4, 0);

ซึ่งจะเน้นตัวอักษรที่ตำแหน่ง 1 - 4 ด้วยสีแดง หวังว่านี่จะช่วยได้!


5
 String name = modelOrderList.get(position).getName();   //get name from List
    String text = "<font color='#000000'>" + name + "</font>"; //set Black color of name
    /* check API version, according to version call method of Html class  */
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N) {
        Log.d(TAG, "onBindViewHolder: if");
        holder.textViewName.setText(context.getString(R.string._5687982) + " ");
        holder.textViewName.append(Html.fromHtml(text));
    } else {
        Log.d(TAG, "onBindViewHolder: else");
        holder.textViewName.setText("123456" + " ");   //set text 
        holder.textViewName.append(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY));   //append text into textView
    }

1
วิธีรับสีตัวอักษรจาก color.xml
Noor Hossain

4

ทางเลือกอื่น: ใช้ WebView แทน Html นั้นใช้งานง่าย

WebView webview = new WebView(this);

String summary = "<html><body>Sorry, <span style=\"background: red;\">Madonna</span> gave no results</body></html>";

webview.loadData(summary, "text/html", "utf-8");


1

เพื่อให้เป็นส่วนหนึ่งของข้อความของคุณที่ขีดเส้นใต้และสี

ใน strings.xml ของคุณ

<string name="text_with_colored_underline">put the text here and &lt;u>&lt;font color="#your_hexa_color">the underlined colored part here&lt;font>&lt;u></string>

จากนั้นในกิจกรรม

yourTextView.setText(Html.fromHtml(getString(R.string.text_with_colored_underline)));

และสำหรับลิงค์ที่คลิกได้:

<string name="text_with_link"><![CDATA[<p>text before link<a href=\"http://www.google.com\">title of link</a>.<p>]]></string>

และในกิจกรรมของคุณ:

yourTextView.setText(Html.fromHtml(getString(R.string.text_with_link)));
yourTextView.setMovementMethod(LinkMovementMethod.getInstance());

0
textview.setText(Html.fromHtml("<font color='rgb'>"+text contain+"</font>"));

มันจะให้สีตรงกับสิ่งที่คุณทำในโปรแกรมแก้ไข html เพียงแค่ตั้งค่า textview และเชื่อมต่อกับค่า textview Android ไม่รองรับช่วงสีเปลี่ยนเป็นสีแบบอักษรในตัวแก้ไขและคุณพร้อมที่จะไปแล้ว


0

ขั้นแรกให้แปลงสตริงของคุณเป็น HTML จากนั้นแปลงเป็น spannable ทำตามที่แนะนำรหัสต่อไปนี้

 Spannable spannable = new SpannableString(Html.fromHtml(labelText));
                    
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(color)), spannable.toString().indexOf("•"), spannable.toString().lastIndexOf("•") + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            

0

การเพิ่มเวอร์ชัน Kotlin ด้วย:

  • รับข้อความจากแหล่งข้อมูล ( strings.xml)
  • รับสีจากทรัพยากร ( colors.xml)
  • "ดึง HEX" ย้ายเป็นส่วนขยาย
fun getMulticolorSpanned(): Spanned {
    // Get text from resources
    val text: String = getString(R.string.your_text_from_resources)

    // Get color from resources and parse it to HEX (RGB) value
    val warningHexColor = getHexFromColors(R.color.your_error_color)

    // Use above string & color in HTML
    val html = "<string>$text<span style=\"color:#$warningHexColor;\">*</span></string>"

    // Parse HTML (base on API version)
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
    } else {
        Html.fromHtml(html)
    }
}

และส่วนขยาย Kotlin (ด้วยการลบอัลฟา):

fun Context.getHexFromColors(
    colorRes: Int
): String {
    val labelColor: Int = ContextCompat.getColor(this, colorRes)
    return String.format("%X", labelColor).substring(2)
}

การสาธิต

การสาธิต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.