Bagaimana mengubah gaya TextView saat runtime

98

Saya memiliki aplikasi android di mana, ketika pengguna mengetuk a TextView, saya ingin menerapkan gaya yang ditentukan.

Saya berpikir untuk menemukan textview.setStyle()tetapi tidak ada. Saya mencoba

textview.setTextAppearance();

tapi tidak berhasil.

Cris
sumber
1
Saya telah membaca di suatu tempat bahwa ini tidak mungkin ... stackoverflow.com/questions/2016249/… . Tetapi Anda dapat menyetel beberapa properti secara terpisah.
Floern
1
Apakah Anda sudah mencoba: textView.setTextTypeface? developer.android.com/reference/android/widget/…
Jonathan Roth
21
@Falmarri Sudahkah ANDA melihat-lihat dokumen TextView api? Jika ya, mungkin Anda bisa mengatakan sesuatu yang lebih konstruktif.
Fletch

Jawaban:

143

Saya melakukan ini dengan membuat file XML baru res/values/style.xmlsebagai berikut:

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

Saya juga memiliki entri di file "strings.xml" saya seperti ini:

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

Kemudian, dalam kode saya, saya membuat ClickListener untuk menjebak acara ketuk pada TextView itu: EDIT: Sejak API 23 'setTextAppearance' tidak digunakan lagi

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

Untuk mengubahnya kembali, Anda akan menggunakan ini:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);
Glenn
sumber
2
Sebenarnya ini tidak bekerja dengan gaya bayangan. Jika Anda ingin mengubah bayangan Anda harus melakukannya dengan cara ini: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas
3
Untuk menghindari pemeriksaan SDK, Anda bisa menggunakan TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Justin Fiedler
90

Seperti saran Jonathan, menggunakan textView.setTextTypefacekarya, saya baru saja menggunakannya di aplikasi beberapa detik yang lalu.

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.
DKDiveDude
sumber
9
Anda bisa menggunakan textView.setTypeface (null, Typeface.BOLD); textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
peceps
2
textView.setTypeface (null, Typeface.BOLD) adalah yang berhasil untuk saya. Tentu saja, Anda dapat menggunakan 1 sebagai gantinya, tetapi saya rasa ini bukan praktik yang baik untuk memasukkan konstanta secara manual. Lebih baik gunakan variabel yang telah ditentukan di perpustakaan.
Pijusn
4
Jangan mendorong orang untuk menggunakan int sebagai ganti konstanta
Chris.Jenkins
3
Bagus! Kesalahan saya adalah saya mengirimkan jenis huruf lama saya di parameter pertama. Jadi itu berfungsi ketika saya mengubah NORMAL -> BOLD tetapi tidak BOLD -> NORMAL. Saya tidak tahu parameter pertama bisa jadi nol! Sekarang ini berfungsi dengan baik untuk saya!
Felipe
12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

Anda mengaturnya dari kode. Jenis huruf

Azhar
sumber
4

Secara terprogram: Jalankan waktu

Anda bisa melakukannya secara terprogram menggunakan 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: Waktu Desain

Anda juga dapat mengatur dalam XML:

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

Semoga ini bisa membantu

Disimpulkan

Menyimpulkan Jain
sumber
2

saya menemukan textView.setTypeface(Typeface.DEFAULT_BOLD);metode yang paling sederhana.

sfera
sumber
Ini mengubah Typeface. bukan gaya yang ditentukan oleh OP.
HBG
Benar, masih ini adalah metode paling sederhana - dan sejauh yang saya ingat satu-satunya metode - pada saat posting. Saya tidak yakin apakah metode API baru telah ditambahkan sementara itu yang memungkinkan pengubahan "gaya" menjadi tebal tanpa mengubah jenis huruf. Harap perbaiki saya jika saya salah.
sfera
1

coba baris kode ini.

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

di sini, ia akan mendapatkan Jenis Huruf saat ini dari textview ini dan menggantinya menggunakan Jenis Huruf baru. Jenis huruf baru di sini DEFAULT_BOLDtetapi Anda dapat menerapkan lebih banyak lagi.

Md. Sajedul Karim
sumber
Anda lebih suka menjelaskan mengapa kode Anda akan menyelesaikan masalahnya, terima kasih.
Muhammed Refaat
OP ingin mengubah gayanya, bukan Typeface.
HBG
0

Bergantung pada gaya yang ingin Anda atur, Anda harus menggunakan metode yang berbeda. Item TextAppearance memiliki penyetelnya sendiri, TypeFace memiliki penyetelnya sendiri, latar belakang memiliki penyetelnya sendiri, dll.

akohout
sumber