Android - mengatur TextView TextStyle secara terprogram?

232

Apakah ada cara untuk mengatur textStyleatribut secara TextViewterprogram? Tampaknya tidak ada setTextStyle()metode.

Untuk lebih jelasnya, saya tidak berbicara tentang gaya Tampilan / Widget! Saya berbicara tentang hal berikut:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />
Jake Wilson
sumber
1
Anda dapat merujuk tautan di bawah, dan mengunci 1 jawaban teratas stackoverflow.com/questions/6200533/…
Tiep
Silakan periksa jawaban saya di sini . Semoga ini bisa membantu Anda
Sumain Jain

Jawaban:

410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface adalah Atribut textStyle.

Seperti yang ditambahkan Shankar V , untuk mempertahankan atribut typeface yang telah ditetapkan sebelumnya, Anda dapat menggunakan:

textview.setTypeface(textview.getTypeface(), Typeface.BOLD);
Raz
sumber
14
seharusnyatextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V
2
@IlyaEremin untuk mempertahankan font yang sebelumnya Anda atur seperti ini.
Sankar V
Mengedit jawaban saya berdasarkan komentar @SankarV.
Raz
13
Saya pikir Anda harus kehilangan DEFAULT: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD);
Iman Akbari
Sebenarnya textview.getTypeface().getStyle()iniandroid:textStyle
Pierre
126

Katakanlah Anda memiliki gaya yang disebut RedHUGEText pada nilai / styles.xml Anda:

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

Cukup buat TextView Anda seperti biasa di file XML layout / your_layout.xml, misalkan:

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

Dan dalam kode java dari Aktivitas Anda, Anda melakukan ini:

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

Itu berhasil untuk saya! Dan itu menerapkan warna, ukuran, gravitasi, dll. Saya telah menggunakannya di handset dan tablet dengan Tingkat API Android dari 8 hingga 17 tanpa masalah. Perhatikan bahwa pada Android 23, metode itu sudah tidak digunakan lagi. Argumen konteks telah dihapus, sehingga baris terakhir harus:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Ingat ... ini berguna hanya jika gaya teks benar-benar tergantung pada kondisi pada logika Java Anda atau Anda sedang membangun UI "on the fly" dengan kode ... jika tidak, lebih baik hanya melakukan:

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

Anda selalu bisa mendapatkannya dengan cara Anda!

Oscar Salguero
sumber
4
Ini hanya akan menetapkan subset atribut yang dapat didefinisikan dalam <style>tag. Itu yang umum (ukuran, warna, gaya), tetapi tidak berlaku untuk orang lain (termasuk padding, latar belakang, gravitasi, dll)
karl
5
Tampaknya membutuhkan min API 23?
William T. Mallard
4
ada dua metode, satu untuk api <23, dan satu untuk api 23+. Mereka tampak identik kecuali yang untuk <23 mengambil argumen konteks dan yang untuk 23+ tidak. Di bawah tenda, yang untuk api 23+ memanggil metode untuk <23 dan menggunakan konteks anggota untuk tampilan teks.
MrPlow
63

Cari setTextAppearanceatau juga setTextTypeface. Ada pertanyaan serupa tentang stackoverflow: Bagaimana mengubah gaya TextView saat runtime

peter.bartos
sumber
setTextAppearance tidak digunakan lagi tingkat api 23
athospy
ada metode baru untuk api 23+ yang tidak mengambil argumen konteks.
MrPlow
52

Begitu banyak cara untuk mencapai tugas ini beberapa di bawah ini: -

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

atau jika Anda ingin melalui xml

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
Duggu
sumber
setTextAppearance () adalah jawaban yang saya cari untuk menerapkan gaya kustom yang didefinisikan dalam XML saya. Terima kasih.
ashario
Menurut pendapat saya, ini adalah jawaban terbaik untuk utas. Banyak opsi untuk secara terprogram memanggil kode
Nguyen Minh Hien
9

Kotlin Version

Untuk mempertahankan font saat ini selain gaya teks:

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

Pertanyaan ini ditanyakan di banyak tempat dengan banyak cara berbeda. Saya awalnya menjawabnya di sini tetapi saya merasa itu relevan di utas ini juga (karena saya berakhir di sini ketika saya sedang mencari jawaban).

Tidak ada solusi satu baris untuk masalah ini, tetapi ini berfungsi untuk kasus penggunaan saya. Masalahnya adalah, konstruktor 'Tampilan (konteks, attrs, defStyle)' tidak merujuk ke gaya aktual, ia menginginkan atribut. Jadi, kami akan:

  1. Tentukan atribut
  2. Buat gaya yang ingin Anda gunakan
  3. Terapkan gaya untuk atribut itu pada tema kami
  4. Buat contoh baru dari tampilan kami dengan atribut itu

Di 'res / values ​​/ attrs.xml', tentukan atribut baru:

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

Dalam res / values ​​/ styles.xml 'Saya akan membuat style yang ingin saya gunakan pada TextView kustom saya

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

Dalam 'res / values ​​/ themes.xml' atau 'res / values ​​/ styles.xml', modifikasi tema untuk aplikasi / aktivitas Anda dan tambahkan gaya berikut:

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

Terakhir, di TextView kustom Anda, sekarang Anda dapat menggunakan konstruktor dengan atribut dan itu akan menerima gaya Anda

public class CustomTextView extends TextView {

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

Perlu dicatat bahwa saya berulang kali menggunakan customTextView di berbagai varian dan tempat yang berbeda, tetapi sama sekali tidak diperlukan bahwa nama tampilan cocok dengan gaya atau atribut atau apa pun. Selain itu, teknik ini harus bekerja dengan tampilan kustom apa pun, bukan hanya TextViews.

Kevin Grant
sumber
5

Ini berhasil untuk saya

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

atau

textview.setTypeface(Typeface.DEFAULT_BOLD);
Ray Hunter
sumber
2

Saya sudah mengatasinya dengan dua metode sederhana.

Ikuti penjelasannya.

Deklarasi gaya saya yang ada:

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

Kode Java Android saya:

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

Salam.

andresmafra
sumber
0

Anda dapat mencoba yang ini

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

Karena setTextAppearance(resId)hanya tersedia untuk API 23 dan di atasnya, gunakan:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Metode ini diterapkan secara internal sebagai berikut:

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);
    }
}
Rohan Taneja
sumber
-1

Seperti yang disebutkan di sini , fitur ini saat ini tidak didukung.

dcanh121
sumber