วิธีเปลี่ยนรูปแบบของ TextView ที่รันไทม์


99

ฉันมีแอป Android ซึ่งเมื่อผู้ใช้แตะ a TextViewฉันต้องการใช้สไตล์ที่กำหนด

ฉันคิดว่าจะหาtextview.setStyle()แต่มันไม่มี ฉันเหนื่อย

textview.setTextAppearance();

แต่ไม่ได้ผล


1
เคยอ่านเจอบางที่บอกว่าทำไม่ได้… stackoverflow.com/questions/2016249/ … . แต่คุณสามารถตั้งค่าคุณสมบัติบางอย่างแยกกันได้
Floern

1
คุณได้ลอง: textView.setTextTypeface หรือไม่? developer.android.com/reference/android/widget/…
Jonathan Roth

21
@Falmarri คุณดูเอกสาร API ของ TextView แล้วหรือยัง? ถ้าเป็นเช่นนั้นคุณอาจพูดอะไรที่สร้างสรรค์กว่านี้
Fletch

คำตอบ:


143

ฉันทำได้โดยสร้างไฟล์ XML ใหม่res/values/style.xmlดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="boldText">
        <item name="android:textStyle">bold|italic</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

    <style name="normalText">
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">#C0C0C0</item>
    </style>

</resources>

ฉันยังมีรายการในไฟล์ "strings.xml" ดังนี้:

<color name="highlightedTextViewColor">#000088</color>
<color name="normalTextViewColor">#000044</color>

จากนั้นในรหัสของฉันฉันสร้าง ClickListener เพื่อดักจับเหตุการณ์การแตะบน TextView นั้น: แก้ไข: เนื่องจาก API 23 'setTextAppearance' เลิกใช้

    myTextView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view){
                    //highlight the TextView
                    //myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    if (Build.VERSION.SDK_INT < 23) {
       myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    } else {
       myTextView.setTextAppearance(R.style.boldText);
    }
     myTextView.setBackgroundResource(R.color.highlightedTextViewColor);
                }
            });

หากต้องการเปลี่ยนกลับคุณจะใช้สิ่งนี้:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);

2
จริงๆแล้วสิ่งนี้ใช้ไม่ได้กับรูปแบบเงา หากคุณต้องการเปลี่ยนเงาคุณต้องทำด้วยวิธีนี้: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas

3
เพื่อหลีกเลี่ยงการตรวจสอบ SDK คุณสามารถใช้ TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Justin Fiedler

90

เหมือนที่โจนาธานแนะนำการใช้textView.setTextTypefaceงานฉันเพิ่งใช้ในแอปเมื่อไม่กี่วินาที

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.

9
คุณสามารถใช้ textView.setTypeface (null, Typeface.BOLD); textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
peceps

2
textView.setTypeface (null, Typeface.BOLD) คือสิ่งที่ใช้ได้ผลสำหรับฉัน แน่นอนคุณสามารถใช้ 1 แทนได้ แต่ฉันเดาว่าการป้อนค่าคงที่ด้วยตนเองไม่ใช่วิธีปฏิบัติที่ดี ใช้ตัวแปรที่กำหนดไว้ล่วงหน้าในไลบรารีได้ดีขึ้น
Pijusn

4
อย่าสนับสนุนให้คนใช้ ints แทนค่าคงที่
Chris Jenkins

3
สิ่งที่ดี! ความผิดพลาดของฉันคือฉันส่งแบบอักษรเก่าของฉันในพารามิเตอร์แรก ดังนั้นมันจะได้ผลเมื่อฉันเปลี่ยน NORMAL -> BOLD แต่ไม่ใช่ BOLD -> NORMAL ฉันไม่รู้ว่าพารามิเตอร์แรกอาจเป็นโมฆะ! ตอนนี้มันใช้งานได้ดีสำหรับฉัน!
Felipe


4

แบบเป็นโปรแกรม: รันไทม์

คุณสามารถเขียนโปรแกรมโดยใช้ setTypeface ():

textView.setTypeface(null, Typeface.NORMAL);      // for Normal Text
textView.setTypeface(null, Typeface.BOLD);        // for Bold only
textView.setTypeface(null, Typeface.ITALIC);      // for Italic
textView.setTypeface(null, Typeface.BOLD_ITALIC); // for Bold and Italic

XML: เวลาออกแบบ

คุณสามารถตั้งค่าใน XML ได้เช่นกัน:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"

หวังว่านี่จะช่วยได้

สรุป


2

ฉันพบว่าtextView.setTypeface(Typeface.DEFAULT_BOLD);เป็นวิธีที่ง่ายที่สุด


สิ่งนี้จะเปลี่ยน Typeface ไม่ใช่สไตล์ตามที่ OP กำหนด
HBG

จริงอยู่นี่เป็นวิธีที่ง่ายที่สุด - และเท่าที่ฉันจำได้วิธีเดียว - ในตอนที่โพสต์ ฉันไม่แน่ใจว่าในระหว่างนี้มีการเพิ่มเมธอด API ใหม่หรือไม่ซึ่งทำให้สามารถเปลี่ยน "style" เป็นตัวหนาได้โดยไม่ต้องแก้ไขแบบอักษร กรุณาแก้ไขฉันถ้าฉันผิด
sfera

1

ลองใช้รหัสบรรทัดนี้

textview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);

ที่นี่จะได้รับ Typeface ปัจจุบันจาก textview นี้และแทนที่ด้วย Typeface ใหม่ แบบอักษรใหม่อยู่ที่นี่DEFAULT_BOLDแต่คุณสามารถใช้งานได้อีกมากมาย


คุณต้องการอธิบายว่าทำไมโค้ดของคุณถึงแก้ปัญหาได้ขอบคุณ
Muhammed Refaat

OP ต้องการเปลี่ยนสไตล์ไม่ใช่แบบอักษร
HBG

0

ดู doco สำหรับ setText () ใน TextView http://developer.android.com/reference/android/widget/TextView.html

ในการจัดรูปแบบสตริงของคุณให้แนบอ็อบเจ็กต์ android.text.style. * เข้ากับ SpannableString หรือดูเอกสารประกอบประเภททรัพยากรที่มีสำหรับตัวอย่างการตั้งค่าข้อความที่จัดรูปแบบในไฟล์ทรัพยากร XML


0

ขึ้นอยู่กับว่าคุณต้องการตั้งค่าสไตล์ใดคุณต้องใช้วิธีการต่างๆ TextAppearance มี setter ของตัวเอง TypeFace มี setter ของตัวเองพื้นหลังมี setter ของตัวเองเป็นต้น

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