TextView พร้อม textSize ที่แตกต่างกัน


90

เป็นไปได้ไหมที่จะตั้ง textSize ที่แตกต่างกันใน TextView เดียว? ฉันรู้ว่าฉันสามารถเปลี่ยนรูปแบบข้อความโดยใช้:

TextView textView = (TextView) findViewById(R.id.textView);
Spannable span = new SpannableString(textView.getText());
span.setSpan(arg0, 1, 10, arg3);
textView.setText(span)

ฉันรู้ว่าช่วงเริ่มต้น ... ตอนท้ายของข้อความฉันต้องการเปลี่ยนขนาด แต่ฉันจะใช้เป็นarg0และarg3อะไรได้บ้าง?

คำตอบ:


201

ลอง

span.setSpan(new RelativeSizeSpan(0.8f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

1
ดูเหมือนถูกต้อง แต่ใช้งานไม่ได้ ข้อความทั้งหมดใน TextView ของฉันมีขนาดเท่ากันตลอดเวลา
woyaru

1
อืมฉันควรใช้ (อัปเดต) ช่วงกับ TextView ของฉันหลังจาก setSpan ()?
woyaru

4
ขออภัยสำหรับความคิดเห็นที่ 3 ของฉัน แต่ฉันได้แก้ไขปัญหานี้แล้ว เพียงแค่: textView.setText(span).
woyaru

คุณรู้ไหมว่าฉันจะรวมขนาดกับสีสำหรับช่วงได้อย่างไร
Ionut Negru

23

ฉันรู้ว่าช้าไปที่จะตอบ แต่ผู้คนก็ยังคงมีคำถามเดียวกันแม้ว่าฉันจะดิ้นรนกับเรื่องนี้มากมาย สมมติว่าคุณมีสองสายนี้อยู่ในไฟล์ strings.xml ของคุณ

 <string name="my_text">You will need a to complete this assembly</string>
 <string name="text_sub1">screwdriver, hammer, and measuring tape</string>

ตอนนี้คุณต้องกำหนดสองสไตล์สำหรับพวกเขาภายใน style.xml ของคุณด้วย textSize ที่แตกต่างกัน

<style name="style0">
    <item name="android:textSize">19sp</item>
    <item name="android:textColor">@color/standout_text</item>
    <item name="android:textStyle">bold</item>
</style>
<style name="style1">
    <item name="android:textSize">23sp</item>
    <item name="android:textColor">@color/standout_light_text</item>
    <item name="android:textStyle">italic</item>
</style>

จากไฟล์ Java ของคุณคุณต้องใช้ spannable เพื่อโหลดสองสไตล์และสตริงบน textView เดียว

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

ด้านล่างนี้คือเมธอด formatStyles ซึ่งจะส่งคืนสตริงที่จัดรูปแบบหลังจากใช้สไตล์

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

13

ลองใช้AbsoluteSizeSpan

snackbarText.setSpan(new AbsoluteSizeSpan(fontsize, true), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

รหัสที่สมบูรณ์คือ:

SpannableStringBuilder snackbarText = new SpannableStringBuilder();
snackbarText.append("Your text");
snackbarText.setSpan(new AbsoluteSizeSpan(fontsize, true), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Snackbar.make(getCurrentFocus(), snackbarText, Snackbar.LENGTH_LONG).setAction("Action", null).show();`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.