Android - ตั้งค่า TextView TextStyle โดยทางโปรแกรมหรือไม่


232

มีวิธีการตั้งค่าtextStyleคุณลักษณะของการTextViewเขียนโปรแกรมหรือไม่? ดูเหมือนจะไม่มีsetTextStyle()วิธีการ

เพื่อความชัดเจนฉันไม่ได้พูดถึงสไตล์ดู / วิดเจ็ต! ฉันกำลังพูดถึงสิ่งต่อไปนี้:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />

1
คุณสามารถอ้างอิงลิงค์ด้านล่างและล็อค 1 คำตอบ stackoverflow.com/questions/6200533/…
Tiep

กรุณาตรวจสอบของฉันคำตอบที่นี่ หวังว่านี่จะช่วยคุณได้
สรุป Jain

คำตอบ:


410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface เป็นแอตทริบิวต์ textStyle

เมื่อเพิ่มShankar Vเพื่อรักษาแอตทริบิวต์แบบอักษรที่ตั้งไว้ก่อนหน้านี้คุณสามารถใช้:

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

14
มันควรจะเป็นtextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V

2
@IlyaEremin เพื่อรักษาแบบอักษรที่ตั้งไว้ก่อนหน้านี้คุณจำเป็นต้องใช้แบบนี้
Sankar V

แก้ไขคำตอบของฉันตามความคิดเห็น @SankarV
Raz

13
ฉันคิดว่าคุณควรปล่อย DEFAULT: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD) ให้หลวม
Iman Akbari

ที่จริงแล้วtextview.getTypeface().getStyle()คือandroid:textStyle
Pierre

126

สมมติว่าคุณมีสไตล์ชื่อ RedHUGEText บนค่า / styles.xml ของคุณ:

<style name="RedHUGEText" parent="@android:style/Widget.TextView">
    <item name="android:textSize">@dimen/text_size_huge</item>
    <item name="android:textColor">@color/red</item>
    <item name="android:textStyle">bold</item>
</style>

เพียงสร้าง TextView ของคุณตามปกติในไฟล์ XML layout / your_layout.xml สมมติว่า:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" />

และในจาวาโค้ดของกิจกรรมของคุณคุณทำสิ่งนี้:

TextView textViewTitle = (TextView) findViewById(R.id.text_view_title);
textViewTitle.setTextAppearance(this, R.style.RedHUGEText);

มันใช้งานได้สำหรับฉัน! และมันใช้สีขนาดแรงโน้มถ่วงและอื่น ๆ ฉันใช้มันกับมือถือและแท็บเล็ตที่มีระดับ Android API ตั้งแต่ 8 ถึง 17 โดยไม่มีปัญหา โปรดทราบว่าในฐานะของ Android 23 วิธีการที่ได้รับการคัดค้าน อาร์กิวเมนต์บริบทได้ถูกดร็อปดังนั้นบรรทัดสุดท้ายจะต้องเป็น:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

จำไว้ว่า ... มันมีประโยชน์ก็ต่อเมื่อสไตล์ของข้อความขึ้นอยู่กับเงื่อนไขในตรรกะของ Java หรือคุณกำลังสร้าง UI "ในทันที" ด้วยรหัส ... ถ้าไม่เป็นเช่นนั้นจะดีกว่า ทำ:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" 
    style="@style/RedHUGEText" />

คุณสามารถเป็นเจ้าของได้!


4
สิ่งนี้จะตั้งค่าชุดย่อยของแอตทริบิวต์ที่สามารถกำหนดได้ใน<style>แท็ก มันเป็นคนทั่วไป (ขนาด, สี, สไตล์) แต่ไม่ได้ใช้คนอื่น ๆ (รวมถึงการขยายพื้นหลังแรงโน้มถ่วง ฯลฯ )
karl

5
ดูเหมือนว่าจะต้องการขั้นต่ำ API 23
William T. Mallard

4
มีสองวิธีวิธีหนึ่งสำหรับ API <23 และอีกวิธีหนึ่งสำหรับ API 23+ ปรากฏขึ้นเหมือนกันยกเว้นอาร์กิวเมนต์สำหรับ <23 รับอาร์กิวเมนต์บริบทและอันที่ 23+ ไม่ได้ ภายใต้ประทุนหนึ่งรายการสำหรับ api 23+ จะเรียกเมธอดสำหรับ <23 และใช้บริบทสมาชิกสำหรับมุมมองข้อความ
MrPlow

63

ค้นหาหรือยังsetTextAppearance setTextTypefaceมีคำถามที่คล้ายกันใน stackoverflow: วิธีการเปลี่ยนสไตล์ของ TextView ที่รันไทม์


setTextAppearance api เลิกใช้แล้วระดับ 23
athospy

มีวิธีการใหม่สำหรับ api 23+ ที่ไม่ได้รับการโต้แย้งบริบท
MrPlow

52

วิธีมากมายในการบรรลุภารกิจนี้มีดังนี้: -

1

String text_view_str = "<b>Bolded text</b>, <i>italic text</i>, even <u>underlined</u>!";
TextView tv = (TextView)findViewById(R.id.ur_text_view_id);
tv.setText(Html.fromHtml(text_view_str));

2

tv.setTypeface(null, Typeface.BOLD);
tv.setTypeface(null, Typeface.ITALIC);
tv.setTypeface(null, Typeface.BOLD_ITALIC);
tv.setTypeface(null, Typeface.NORMAL);

3

SpannableString spannablecontent=new SpannableString(o.content.toString());
spannablecontent.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 
                         0,spannablecontent.length(), 0);
// set Text here
tt.setText(spannablecontent);

4

<?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>

 tv.setTextAppearance(getApplicationContext(), R.style.boldText);

หรือถ้าคุณต้องการผ่าน xml

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

setTextAppearance () เป็นคำตอบที่ฉันใช้เพื่อกำหนดสไตล์ที่กำหนดเองใน XML ของฉัน ขอบคุณ
ashario

ในความคิดของฉันนี่คือคำตอบที่ดีที่สุดสำหรับเธรด ตัวเลือกมากมายสำหรับการโทรด้วยรหัสโดยทางโปรแกรม
Nguyen Minh Hien

9

Kotlin Version

หากต้องการคงฟอนต์ปัจจุบันนอกเหนือจากสไตล์ข้อความ:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}

7

คำถามนี้ถูกถามในหลาย ๆ ที่ในหลาย ๆ วิธี ฉันตอบมันมาที่นี่ แต่ฉันรู้สึกว่ามันเกี่ยวข้องในหัวข้อนี้เช่นกัน (ตั้งแต่ฉันสิ้นสุดที่นี่เมื่อฉันค้นหาคำตอบ)

ไม่มีวิธีแก้ปัญหาหนึ่งบรรทัดสำหรับปัญหานี้ แต่สิ่งนี้ใช้ได้กับกรณีการใช้งานของฉัน ปัญหาคือตัวสร้าง 'มุมมอง (บริบท, attrs, defStyle)' ไม่ได้อ้างถึงสไตล์ที่แท้จริง แต่ต้องการแอตทริบิวต์ ดังนั้นเราจะ:

  1. กำหนดแอตทริบิวต์
  2. สร้างสไตล์ที่คุณต้องการใช้
  3. ใช้สไตล์สำหรับแอตทริบิวต์นั้นในธีมของเรา
  4. สร้างอินสแตนซ์ใหม่ของมุมมองของเราด้วยแอตทริบิวต์นั้น

ใน 'res / values ​​/ attrs.xml' ให้กำหนดแอตทริบิวต์ใหม่:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

ใน res / values ​​/ styles.xml 'ฉันจะสร้างสไตล์ที่ฉันต้องการใช้กับ TextView ที่กำหนดเองของฉัน

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

ใน 'res / values ​​/ themes.xml' หรือ 'res / values ​​/ styles.xml' ให้ปรับเปลี่ยนธีมสำหรับแอปพลิเคชัน / กิจกรรมของคุณและเพิ่มสไตล์ต่อไปนี้:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

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

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
       super(context, null, R.attr.customTextView);
    }
}

เป็นที่น่าสังเกตว่าฉันใช้ customTextView ซ้ำหลายครั้งในรูปแบบที่แตกต่างกันและสถานที่ต่าง ๆ แต่ก็ไม่จำเป็นว่าชื่อของมุมมองจะตรงกับสไตล์หรือแอตทริบิวต์หรืออะไรก็ตาม นอกจากนี้เทคนิคนี้ควรทำงานกับมุมมองที่กำหนดเองไม่ได้เป็นเพียง TextViews



2

ฉันแก้ไขด้วยวิธีง่ายๆสองวิธี

ทำตามคำอธิบาย

ประกาศสไตล์ของฉันที่มีอยู่:

<style name="SearchInfoText">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">24sp</item>
    <item name="android:textColor">@color/Church_Grey</item>
    <item name="android:shadowColor">@color/Shadow_Church</item>
    <item name="android:shadowRadius">3</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
</style>

รหัส Java Android ของฉัน:

    TextView locationName = new TextView(getSupportActivity());
    locationName.setId(IdGenerator.generateViewId());
    locationName.setText(location.getName());
    locationName.setLayoutParams(super.centerHorizontal());
    locationName.setTextSize(24f);
    locationName.setPadding(0, 0, 0, 15);
    locationName.setTextColor(getResources().getColor(R.color.Church_Grey));
    locationName.setShadowLayer(3, 1, 1,  getResources().getColor(R.color.Shadow_Church));

ความนับถือ.


0

คุณอาจลองอันนี้

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                textView.setTextAppearance(R.style.Lato_Bold);
            } else {
                textView.setTextAppearance(getActivity(), R.style.Lato_Bold);
            }

0

เนื่องจากsetTextAppearance(resId)ใช้ได้เฉพาะกับ API 23 ขึ้นไปเท่านั้นให้ใช้:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

วิธีนี้มีการใช้ภายในดังนี้:

public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
    if (Build.VERSION.SDK_INT >= 23) {
        textView.setTextAppearance(resId);
    } else {
        textView.setTextAppearance(textView.getContext(), resId);
    }
}

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