เป็นไปได้หรือไม่ที่จะมีหลายสไตล์ภายใน TextView


547

เป็นไปได้ไหมที่จะกำหนดสไตล์หลาย ๆ แบบสำหรับข้อความที่แตกต่างกันภายใน TextView?

ตัวอย่างเช่นฉันกำลังตั้งค่าข้อความดังนี้:

tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);

เป็นไปได้ไหมที่จะมีสไตล์แตกต่างกันสำหรับองค์ประกอบข้อความแต่ละรายการ? เช่นตัวหนา line1 ตัวเอียง word1 เป็นต้น

ภารกิจทั่วไปของคู่มือผู้พัฒนาและวิธีการทำสิ่งเหล่านี้ใน Androidประกอบด้วยการเลือกการเน้นหรือการกำหนดส่วนของข้อความ :

// Get our EditText object.
EditText vw = (EditText)findViewById(R.id.text);

// Set the EditText's text.
vw.setText("Italic, highlighted, bold.");

// If this were just a TextView, we could do:
// vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);
// to force it to use Spannable storage so styles can be attached.
// Or we could specify that in the XML.

// Get the EditText's internal text storage
Spannable str = vw.getText();

// Create our span sections, and assign a format to each.
str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

แต่นั่นใช้ตัวเลขตำแหน่งที่ชัดเจนภายในข้อความ มีวิธีที่สะอาดกว่านี้หรือไม่?


6
หากสตริง TextView เป็นแบบสแตติกคุณสามารถเพิ่มแท็ก html <b>, <i> และ <u> ลงในไฟล์ทรัพยากรของสายอักขระได้และจะถูกนำไปใช้โดยอัตโนมัติ เช่น <TextView android: text = "@ string / test" /> โดยที่ @ string / test ตั้งเป็น <string> <b> ตัวหนา </b>, <i>italic</i> </string>
greg7gkb

2
+1 @ greg7gkb! คำสำคัญคือ 'คงที่' ฉันดึงผมออกมาสงสัยว่าทำไมบางส่วนของสายของฉันทำงานกับ <b> และบางคนไม่ได้ คนที่ไม่ได้มีตัวแปรในพวกเขา
Scott Biggs

คำตอบ:


694

ในกรณีที่ทุกคนสงสัยว่าจะทำอย่างไรต่อไปนี้เป็นวิธีหนึ่ง: (ขอบคุณ Mark อีกครั้ง!)

mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" +  "<br />" + 
            "<small>" + description + "</small>" + "<br />" + 
            "<small>" + DateAdded + "</small>"));

สำหรับรายการแท็กที่ไม่เป็นทางการที่สนับสนุนโดยวิธีนี้ให้อ้างอิงลิงก์นี้หรือคำถามนี้: Android TextView รองรับแท็ก HTML ใด


1
@ JānisGruzis: บางทีวิธีหนึ่งในการทำเช่นนี้จะผ่านวิธีต้นขั้วพูดว่าเพียงแค่แทรกข้อความลงในสตริงรูปแบบต่อไปนี้:formatTextWhite(string text) "<font size="..." color="..." face="...">%s</font>"
ตำนาน

@Legend ฉันใช้ <font fgcolor = '# ffff5400'> <b> <big> "+" ชื่อ "+" </big> </b> </font> แต่ fgcolor / สี (ทั้งคู่พยายาม) ไม่ได้ ทำงาน ... คุณจะรู้วิธีที่จะทำสิ่งที่สีโดยใช้ HTML
มูฮัมหมัด Babar

@MuhammadBabar: คุณลองสิ่งนี้ได้Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");ไหม? ฉันจำได้ว่างานนี้บางครั้งก็กลับมาสำหรับฉัน ไม่แน่ใจว่ายังใช้งานได้หรือไม่
ตำนาน

1
@Legend ขอบคุณ แต่มีวิธีHtml.fromHtml("<font color=\"#999999\">การแก้ไขลำดับดังนี้:) ...
Muhammad Babar

2
ทำไมสิ่งนี้ถึงไม่ได้ผล mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);ขอบคุณ
Shan Xeeshi

216

ลองHtml.fromHtml()และทำเครื่องหมายข้อความของคุณด้วยแท็ก HTML ที่เป็นตัวหนาและตัวเอียงเช่น:

Spanned text = Html.fromHtml("This mixes <b>bold</b> and <i>italic</i> stuff");
textView.setText(text);

1
ที่จริงแล้วทำให้ฉันมีคำถามอื่น: มันจะดีกว่าที่จะมีหนึ่ง textview กับข้อความ HTML ภายในหรือสามมุมมองข้อความที่มีการตั้งค่ามาร์กอัปที่แตกต่างกันโดยไม่ต้องใช้ชั้น html? ฉันสมมติว่าเห็นได้ชัดว่าเป็นคนแรก แต่แค่อยากจะยืนยัน ...
ตำนาน

2
ฉันไม่รู้ว่าแท็กชื่อเต็มที่ Html.fromHtml รองรับคืออะไรคุณต้องดูซอร์สโค้ด มาร์กอัปแบบอินไลน์และวิดเจ็ต TextView หลายรายการควรเป็นการตัดสินใจแบบตั้งฉาก ใช้วิดเจ็ตหลายตัวหากคุณต้องการตำแหน่งของข้อความที่ไม่ต่อเนื่อง ใช้มาร์กอัปแบบอินไลน์หากคุณต้องการใช้มาร์กอัปแบบอินไลน์ในวิดเจ็ต ข้อควรจำ: ไม่มี FlowLayout ใน Android ดังนั้นการรวมสตริง TextViews หลายรายการเข้าด้วยกันเพื่อสร้างย่อหน้าไม่ใช่ AFAIK ที่ใช้งานได้จริง
CommonsWare

1
ขอขอบคุณสำหรับการที่ ... ที่จริง <small> แท็กทำงาน ... ดังนั้นฉันจะให้มันง่ายและเพียงแค่ใช้มัน ...
ตำนาน

1
@ TimBoland: คุณละทิ้งช่วงเวลาของคุณmonthText + " " + month.getYearLabel()ไป StringUtils.concat()ดู
CommonsWare

2
@ TimBoland: คุณสามารถทำได้ทั้งหมดในที่เดียว: monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b>&nbsp;"+month.getYearLabel()))หากคุณไม่ต้องการชิ้นส่วนแต่ละชิ้น
CommonsWare

191

ปิดหัวข้อเล็กน้อย แต่ฉันพบว่ามีประโยชน์เกินไปที่จะไม่พูดถึงที่นี่

จะเป็นอย่างไรถ้าเราต้องการอ่านข้อความ Html จากทรัพยากรstring.xmlและทำให้ง่ายต่อการแปล CDATAทำให้เป็นไปได้:

<string name="my_text">
  <![CDATA[
    <b>Autor:</b> Mr Nice Guy<br/>
    <b>Contact:</b> myemail@grail.com<br/>
    <i>Copyright © 2011-2012 Intergalactic Spacebar Confederation </i>
  ]]>
</string> 

จากโค้ด Java ของเราเราสามารถใช้มันในลักษณะนี้:

TextView tv = (TextView) findViewById(R.id.myTextView);
tv.setText(Html.fromHtml(getString(R.string.my_text))); 

ฉันไม่ได้คาดหวังว่าสิ่งนี้จะทำงาน แต่มันก็ทำ

หวังว่ามันจะเป็นประโยชน์กับคุณบางคน!


2
โดยปกติแล้ว "เท็จ" หมายความว่าคุณเข้าถึงค่าแปลก ๆ บนตารางการค้นหา ฉันได้สิ่งนี้เมื่อฉันมี R.id.ok และ R.string.ok และใช้ getString (R.id.ok) แทนการใช้ getString ที่ถูกต้อง (R.string.ok)
Joe Plante

มันใช้งานได้ใน layout-XML หรือไม่? เมื่อฉันอ้างถึงทรัพยากรสตริงที่มี"@string/someText"(ที่ "someText" เป็นทรัพยากรที่กำหนดไว้ใน strings.xml) ฉันเพิ่งได้รับสตริงที่มีแท็ก HTML ทั้งหมดเป็น 'ข้อความ'
Gee.E

3
ฉันพบว่านี่เป็นคำตอบที่ดีที่สุด เป็นแรงบันดาลใจให้ฉัน อดไม่ได้ที่จะใส่คำตอบที่คุ้มค่ากับสองเซ็นต์ด้วย วิธีแก้ไขที่นี่gist.github.com/aegis1980/b138dcb2fd1b2e98aa30ช่วยให้คุณกำหนดในไฟล์เลย์เอาต์ดังนั้นคุณไม่จำเป็นต้องกำหนดทรัพยากรข้อความโดยทางโปรแกรม (และสามารถดูตัวอย่างใน Android Studio!)
Jon

127

หากคุณไม่รู้สึกอยากใช้ html คุณสามารถสร้าง styles.xml และใช้แบบนี้:

TextView tv = (TextView) findViewById(R.id.textview);
SpannableString text = new SpannableString(myString);

text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

tv.setText(text, TextView.BufferType.SPANNABLE);

คัดลอก / วางไปยังแอปพลิเคชัน Android ที่คุณอาจใช้งาน คุณจะเห็นว่าใน textview เดียวสองรูปแบบจะนำไปใช้
Kent Andersen

ขอโทษฉันไม่ชัดเจน หากคุณต้องระบุสตริงย่อย (ผ่านดัชนีสองตัว) ของตำแหน่งที่จะใช้สไตล์นั้นจะไม่ทำงานสำหรับสตริงที่แปลแล้วเพราะแน่นอนว่าดัชนีจะแตกต่างกันสำหรับทุกโลแคล
Jeffrey Blattman

คุณถูก. หากคุณรองรับหลายภาษานี่จะไม่ใช่เส้นทางที่คุณต้องการ เว้นแต่คุณจะแน่ใจว่าสตริงจะไม่เปลี่ยนขนาด ... เช่นชื่อแอปพลิเคชันเช่น
Kent Andersen

9
ฉันไม่เห็นว่าทำไม l10n ไม่สามารถทำงานกับโซลูชันนี้ เพิ่งได้รับสตริงที่แยกต่างหากแทนที่จะเป็นเพียงหนึ่ง: String firstPart = getString (R.string.line1); String secondPart = getString (R.string.line2); ข้อความ Spannable = ใหม่ SpannableString (firstPart + secondPart); text.setSpan (ใหม่ ForegroundColorSpan (Color.parseColor (TEXT_COLOR_FOR_FIRST_PART)), 0, firstPart.length (), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) myTextView.setText (ข้อความ, TextView.BufferType.SPANNABLE);
รุย

5
@Rui เพราะ l10n เป็นตำแหน่งเช่นกัน คุณไม่สามารถ hardcode ตำแหน่งของคำในวลีและยังคงเป็น l10n นั่นเป็นเหตุผลที่คุณเห็นสิ่งต่าง ๆ เช่น$1%s is a happy $2%sในชุดสตริง คุณต้องอนุญาตโทเค็นให้จัดใหม่
Jeffrey Blattman

60

มีน้ำหนักเบากว่าที่จะใช้SpannableStringแทนมาร์กอัป html มันช่วยให้ฉันเห็นตัวอย่างด้วยภาพดังนั้นนี่คือคำตอบเพิ่มเติม

ป้อนคำอธิบายรูปภาพที่นี่

TextViewนี้เป็นเพียงครั้งเดียว

// set the text
SpannableString s1 = new SpannableString("bold\n");
SpannableString s2 = new SpannableString("italic\n");
SpannableString s3 = new SpannableString("foreground color\n");
SpannableString s4 = new SpannableString("background color\n");
SpannableString s5 = new SpannableString("underline\n");
SpannableString s6 = new SpannableString("strikethrough\n");
SpannableString s7 = new SpannableString("bigger\n");
SpannableString s8 = new SpannableString("smaller\n");
SpannableString s9 = new SpannableString("font\n");
SpannableString s10 = new SpannableString("URL span\n");
SpannableString s11 = new SpannableString("clickable span\n");
SpannableString s12 = new SpannableString("overlapping spans\n");

// set the style
int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
s1.setSpan(new StyleSpan(Typeface.BOLD), 0, s1.length(), flag);
s2.setSpan(new StyleSpan(Typeface.ITALIC), 0, s2.length(), flag);
s3.setSpan(new ForegroundColorSpan(Color.RED), 0, s3.length(), flag);
s4.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, s4.length(), flag);
s5.setSpan(new UnderlineSpan(), 0, s5.length(), flag);
s6.setSpan(new StrikethroughSpan(), 0, s6.length(), flag);
s7.setSpan(new RelativeSizeSpan(2), 0, s7.length(), flag);
s8.setSpan(new RelativeSizeSpan(0.5f), 0, s8.length(), flag);
s9.setSpan(new TypefaceSpan("monospace"), 0, s9.length(), flag);
s10.setSpan(new URLSpan("https://developer.android.com"), 0, s10.length(), flag);
s11.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        Toast.makeText(getApplicationContext(), "Span clicked", Toast.LENGTH_SHORT).show();
    }
}, 0, s11.length(), flag);
s12.setSpan(new ForegroundColorSpan(Color.RED), 0, 11, flag);
s12.setSpan(new BackgroundColorSpan(Color.YELLOW), 4, s12.length(), flag);
s12.setSpan(new UnderlineSpan(), 4, 11, flag);

// build the string
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(s1);
builder.append(s2);
builder.append(s3);
builder.append(s4);
builder.append(s5);
builder.append(s6);
builder.append(s7);
builder.append(s8);
builder.append(s9);
builder.append(s10);
builder.append(s11);
builder.append(s12);

// set the text view with the styled text
textView.setText(builder);
// enables clicking on spans for clickable span and url span
textView.setMovementMethod(LinkMovementMethod.getInstance());

การศึกษาต่อ

ตัวอย่างนี้เป็นแรงบันดาลใจมีพื้นเพมาจากที่นี่


5
โพสต์ของคุณดีกว่า Google Documentation เกี่ยวกับ SpannableString .. ขอบคุณ
MBH

สิ่งนี้สนับสนุนรูปภาพที่มาจากบริการบนเว็บหรือไม่ ความต้องการของฉันเป็นอย่างนั้น
MohanRaj S

@MohanRajS SpannableStrings สนับสนุน Unicode emoji แต่ไม่ใช้รูปภาพอื่น
Suragch

@Suragch ขอบคุณสำหรับการตอบสนองที่รวดเร็ว แต่ความต้องการด้านของฉันคือ jpg, png ทางเลือกเดียวในการจัดการคือ webview :(
MohanRaj S

43

รายการแท็กที่รองรับคือ:

หากคุณใช้ทรัพยากรของสตริงคุณสามารถเพิ่มสไตล์ที่เรียบง่ายเช่นตัวหนาหรือตัวเอียงโดยใช้สัญลักษณ์ HTML แท็กได้รับการสนับสนุนขณะนี้: B(ตัวหนา), I(ตัวเอียง) U(ขีดเส้นใต้) TT(monospace) BIG, SMALL, SUP(ยก) SUB(ห้อย) และSTRIKE(ขีด) ตัวอย่างเช่นres/values/strings.xmlคุณสามารถประกาศสิ่งนี้ได้:

<resource>
    <string id="@+id/styled_welcome_message">We are <b><i>so</i></b> glad to see you.</string>
</resources>

(จากhttp://developer.android.com/guide/faq/commontasks.html#selectingtext - ลิงก์คลังเว็บตัว<resource>พิมพ์ผิดอยู่ในต้นฉบับ!)

นอกจากนี้ยังแสดงให้เห็นว่าHtml.fromHtmlไม่จำเป็นจริงๆในกรณีง่าย ๆ


Html.fromHtml มักเป็นวิธีที่ง่ายกว่าในการจัดรูปแบบข้อความ นอกจากนี้ลิงก์นี้อยู่ในคำถามเดิมแล้ว
ซับซ้อน

17

ฉันพบปัญหาเดียวกัน ฉันสามารถใช้จาก HTML แต่ตอนนี้ฉันเป็น android ไม่ใช่เว็บดังนั้นฉันจึงตัดสินใจลองใช้ ฉันต้อง จำกัด วงนี้แม้ว่าฉันจะให้มันยิงโดยใช้แนวคิดการเปลี่ยนสตริง ฉันตั้งค่าสไตล์ใน TextView ให้เป็นสไตล์หลักจากนั้นเพียงจัดรูปแบบส่วนอื่น ๆ

ฉันหวังว่านี่จะช่วยให้คนอื่น ๆ มองหาที่จะทำสิ่งเดียวกัน - ฉันไม่รู้ว่าทำไมสิ่งนี้จึงไม่ง่ายขึ้นในกรอบ

สายของฉันมีลักษณะเช่นนี้:


<string name="my_text">{0} You will need a {1} to complete this assembly</string>
<string name="text_sub0">1:</string>
<string name="text_sub1">screwdriver, hammer, and measuring tape</string>

นี่คือรูปแบบ:


<style name="MainStyle">
    <item name="android:textSize">@dimen/regular_text</item>
    <item name="android:textColor">@color/regular_text</item>
</style>
<style name="style0">
    <item name="android:textSize">@dimen/paragraph_bullet</item>
    <item name="android:textColor">@color/standout_text</item>
    <item name="android:textStyle">bold</item>
</style>
<style name="style1">
    <item name="android:textColor">@color/standout_light_text</item>
    <item name="android:textStyle">italic</item>
</style>

นี่คือรหัสของฉันที่เรียกเมธอด formatStyles ของฉัน:


SpannableString formattedSpan = formatStyles(getString(R.string.my_text), getString(R.string.text_sub0), R.style.style0, getString(R.string.main_text_sub1), R.style.style1);
textView.setText(formattedSpan, TextView.BufferType.SPANNABLE);

วิธีการจัดรูปแบบ:


private SpannableString formatStyles(String value, String sub0, int style0, String sub1, int style1)
{
    String tag0 = "{0}";
    int startLocation0 = value.indexOf(tag0);
    value = value.replace(tag0, sub0);

    String tag1 = "{1}";
    int startLocation1 = value.indexOf(tag1);
    if (sub1 != null && !sub1.equals(""))
    {
        value = value.replace(tag1, sub1);
    }

    SpannableString styledText = new SpannableString(value);
    styledText.setSpan(new TextAppearanceSpan(getActivity(), style0), startLocation0, startLocation0 + sub0.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    if (sub1 != null && !sub1.equals(""))
    {
        styledText.setSpan(new TextAppearanceSpan(getActivity(), style1), startLocation1, startLocation1 + sub1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    }

    return styledText;
}

ฉันไม่คิดว่ามันจะใช้งานได้หากมีการแปลสตริงของรุ่นใหม่ {0} และ {1} คุณอาจต้องเปลี่ยน startLocation0 ถ้า startLocation1 คือ <startLocation0
JonathanC


8

นี่เป็นวิธีง่ายๆในการใช้HTMLBuilder

    myTextView.setText(new HtmlBuilder().
                    open(HtmlBuilder.Type.BOLD).
                    append("Some bold text ").
                    close(HtmlBuilder.Type.BOLD).
                    open(HtmlBuilder.Type.ITALIC).
                    append("Some italic text").
                    close(HtmlBuilder.Type.ITALIC).
                    build()
    );

ผลลัพธ์:

ข้อความตัวหนา บางข้อความตัวเอียงบางอย่าง


7

หากคุณต้องการที่จะเพิ่มข้อความสไตล์ใน xml คุณสามารถสร้างมุมมองที่กำหนดเองขยาย TextView และแทนที่ setText ():

public class HTMLStyledTextView extends TextView
{
    public HTMLStyledTextView(Context context) {
        super(context);
    }

    public HTMLStyledTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HTMLStyledTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setText(CharSequence text, BufferType type)
    {
       super.setText(Html.fromHtml(text.toString()), type);
    }
}

จากนั้นคุณสามารถใช้มันได้เช่นนี้ (แทนที่PACKAGE_NAMEด้วยชื่อแพ็คเกจของคุณ):

<PACKAGE_NAME.HTMLStyledTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="<![CDATA[
        <b>Bolded Text:</b> Non-Bolded Text
    ]]>"
/>

มันแสดงตัวอย่างใน Android Studio หรือไม่
JPM

7

ตามที่ระบุไว้ใช้ TextView.setText(Html.fromHtml(String))

และใช้แท็กเหล่านี้ในสตริงที่จัดรูปแบบ Html ของคุณ:

<a href="...">
<b>
<big>
<blockquote>
<br>
<cite>
<dfn>
<div align="...">
<em>
<font size="..." color="..." face="...">
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<i>
<img src="...">
<p>
<small>
<strike>
<strong>
<sub>
<sup>
<tt>
<u>

http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html


3

ฉันด้วย

วิธีการเกี่ยวกับการใช้มาร์กอัปที่สวยงามด้วย Kotlin และAnko -

import org.jetbrains.anko.*
override fun onCreate(savedInstanceState: Bundle?) {
    title = "Created with Beautiful Markup"
    super.onCreate(savedInstanceState)

    verticalLayout {
        editText {
            hint = buildSpanned {
                append("Italic, ", Italic)
                append("highlighted", backgroundColor(0xFFFFFF00.toInt()))
                append(", Bold", Bold)
            }
        }
    }
}

สร้างด้วย Markup ที่สวยงาม


2

SpannedStringใช่มันเป็นไปได้โดยใช้ หากคุณกำลังใช้ Kotlin การทำเช่นนั้นจะง่ายขึ้นโดยใช้core-ktxเนื่องจากมีภาษาเฉพาะโดเมน (DSL)สำหรับการทำสิ่งนี้:

    val string: SpannedString = buildSpannedString {
        bold {
            append("1111")
        }
        append("Devansh")     
    }

ตัวเลือกเพิ่มเติมโดย:

append("Hello There")
bold {
    append("bold")
    italic {
        append("bold and italic")
        underline {
            append("then some text with underline")
        }
    }
}

ในที่สุดคุณสามารถ:

textView.text = string

0

ในความเป็นจริงยกเว้นวัตถุ Html คุณสามารถใช้คลาส Spannable เช่น TextAppearanceSpan หรือ TypefaceSpan และ SpannableString togather คลาส Html ยังใช้กลไกเหล่านี้ แต่ด้วยคลาสชนิด Spannable คุณจะมีอิสระมากขึ้น


0

มันอาจจะง่ายเหมือนการใช้ประโยชน์จากความยาวของ String

  1. แยกสตริงข้อความในไฟล์ XML Strings เป็นสตริงย่อยจำนวนมาก (สตริงแยกจากมุมมองของ Android) เป็นจำนวนมากที่คุณต้องการสไตล์ที่แตกต่างดังนั้นมันอาจจะเป็นเช่น: str1, str2, str3 (ในกรณีของคุณ) ซึ่งเมื่อรวมเข้าด้วยกันจะเป็นสตริงเดี่ยวทั้งหมดที่คุณใช้

  2. จากนั้นทำตามวิธี "ช่วง" เช่นเดียวกับที่คุณนำเสนอด้วยรหัสของคุณ - แต่แทนที่จะเป็นสตริงเดียวให้รวมสตริงย่อยทั้งหมดที่รวมไว้เป็นหนึ่งเดียวโดยแต่ละแบบมีสไตล์ที่แตกต่างกัน

คุณยังคงใช้ตัวเลข แต่ไม่โดยตรง - ตอนนี้พวกเขาจะไม่อยู่ในรูปแบบ hardcoded (ในรหัสของคุณ) ตอนนี้ แต่พวกเขาจะถูกแทนที่ด้วยวิธีการความยาวรวม () (สังเกตดาวสองดวงที่อยู่ข้างหน้า length () แทนจำนวนที่แน่นอนเพื่อยืดอายุการเปลี่ยนแปลง):

str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, **str.length()**, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

สำหรับขนาดสตริงแรกจากนั้นstr.length () + 1, str.length () + str2.length ()สำหรับขนาดสตริงที่สองและอื่น ๆ ด้วยสตริงย่อยทั้งหมดเช่น 0,7 หรือ 8,19 และอื่น ๆ ...


0

การใช้คลาส Spannable เสริมเป็นทรัพยากรสตริง Androidแชร์ที่ด้านล่างของหน้าเว็บ คุณสามารถเข้าถึงสิ่งนี้ได้โดยการสร้างCharSquencesและให้สไตล์กับพวกเขา

แต่ในตัวอย่างที่พวกเขาให้เรานั้นเป็นเพียงตัวหนาตัวเอียงและแม้แต่สี ผมจำเป็นต้องมีการห่อหลายรูปแบบในเพื่อที่จะตั้งไว้ในCharSequence TextViewดังนั้นใน Class นั้น (ฉันตั้งชื่อมันCharSequenceStyles) ฉันเพิ่งเพิ่มฟังก์ชั่นนี้

public static CharSequence applyGroup(LinkedList<CharSequence> content){
    SpannableStringBuilder text = new SpannableStringBuilder();
    for (CharSequence item : content) {
        text.append(item);
    }
    return text;
}

และในมุมมองฉันเพิ่มนี้

            message.push(postMessageText);
            message.push(limitDebtAmount);
            message.push(pretMessageText);
            TextView.setText(CharSequenceStyles.applyGroup(message));

ฉันหวังว่านี่จะช่วยคุณได้!



0

ดังที่จอนกล่าวสำหรับฉันนี่เป็นทางออกที่ดีที่สุดและคุณไม่จำเป็นต้องตั้งค่าข้อความใด ๆ ในขณะรันไทม์ให้ใช้คลาสที่กำหนดเองนี้เท่านั้น HtmlTextView

public class HtmlTextView extends TextView {

  public HtmlTextView(Context context) {
      super(context);
  }

  public HtmlTextView(Context context, AttributeSet attrs) {
      super(context, attrs);
  }

  public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) 
  {
      super(context, attrs, defStyleAttr);
  }

  @TargetApi(21)
  public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
      super(context, attrs, defStyleAttr, defStyleRes);
  }

  @Override
  public void setText(CharSequence s,BufferType b){
      super.setText(Html.fromHtml(s.toString()),b);
  }

}

และนั่นคือตอนนี้เพียงวางไว้ใน XML ของคุณ

<com.fitc.views.HtmlTextView
    android:id="@+id/html_TV"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/example_html" />

ด้วย Html String ของคุณ

<string name="example_html">
<![CDATA[
<b>Author:</b> Mr Donuthead<br/>
<b>Contact:</b> me@donut.com<br/>
<i>Donuts for life </i>
]]>

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