Menyetel gaya global untuk Tampilan di Android

125

Katakanlah saya ingin semua TextViewinstance di aplikasi saya memiliki textColor="#ffffff". Apakah ada cara untuk menyetelnya di satu tempat alih-alih menyetelnya untuk masing-masing TextView?

Emanuil Rusev
sumber
1
Saya telah memperbarui pertanyaan saya agar lebih lengkap.
Cristian
Saya melakukan hal serupa DI SINI !!! stackoverflow.com/questions/17103894/…
toobsco42

Jawaban:

250

Sebenarnya, Anda dapat menyetel gaya default untuk TextView (dan sebagian besar widget bawaan lainnya) tanpa perlu melakukan kelas java khusus atau menyetel gaya satu per satu.

Jika Anda melihat di themes.xmlsumber Android, Anda akan melihat banyak atribut untuk gaya default untuk berbagai widget. Kuncinya adalah atribut textViewStyle(atau editTextStyle, etc.) yang Anda ganti di tema kustom Anda. Anda dapat menggantinya dengan cara berikut:

Buat styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="android:Theme">
    <item name="android:textViewStyle">@style/MyTextViewStyle</item>
</style>

<style name="MyTextViewStyle" parent="android:Widget.TextView">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
</style>
</resources>

Kemudian terapkan tema itu ke aplikasi Anda di AndroidManifest.xml:

<application […] android:theme="@style/MyTheme">

Dan semua tampilan teks Anda akan default ke gaya yang ditentukan dalam MyTextViewStyle(dalam hal ini, tebal dan merah)!

Ini telah diuji pada perangkat dari API level 4 dan seterusnya dan tampaknya berfungsi dengan baik.

Steve Pomeroy
sumber
1
Solusi paling elegan yang saya lihat sampai sekarang.
Italo Borssatto
@Steve, jika saya menyertakan item <item name="android:textViewStyle">@style/MyTextViewStyle</item>dalam gaya Tema Saya dan kemudian menerapkan gaya ke aplikasi saya, semua milik saya TextViewakan ditampilkan sesuai dengan gayanya (bahkan nama aplikasi di bilah tindakan). Bagaimana cara memperbaiki masalah dengan bilah tindakan? Saya ingin memiliki tampilan default. Github
Maksim Dmitriev
@Steve, Cara menerapkan tema (bilah tindakan dan widget) pada aplikasi
Pratik Butani
Saya tidak yakin tentang bagaimana membedakan ActionBar dari hal-hal lain. Anda mungkin dapat menemukan di mana pun gaya ActionBar Anda disetel dan kemudian meletakkannya di <item name="android:textViewStyle">@style/MyTextViewStyle</item>sana juga, cukup dengan menunjuk ke default ActionBar (atau yang serupa)
Steve Pomeroy
@StevePomeroy ini tidak bekerja untuk saya .. dapatkah Anda memberikan beberapa Dukungan. Style saya untuk TextView tetap sama. Apakah ada Minimum item yang perlu saya atur atau ada beberapa item yang tidak boleh saya atur?
Mike
52

Ada dua cara untuk melakukannya:

1. Menggunakan gaya

Anda dapat menentukan gaya Anda sendiri dengan membuat file XML di res/valuesdirektori. Jadi, misalkan Anda ingin memiliki teks merah dan tebal, lalu Anda membuat file dengan konten ini:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyRedTheme" parent="android:Theme.Light">
    <item name="android:textAppearance">@style/MyRedTextAppearance</item>
  </style>
  <style name="MyRedTextAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
  </style>
</resources>

Anda dapat menamainya sesuai keinginan, misalnya res/values/red.xml. Kemudian, satu-satunya hal yang harus Anda lakukan adalah menggunakan tampilan tersebut di widget yang Anda inginkan, misalnya:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    style="@style/MyRedTheme"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

Untuk referensi lebih lanjut, Anda dapat membaca artikel ini: Memahami Tema dan Gaya Android

2. Menggunakan kelas khusus

Ini adalah cara lain yang mungkin untuk mencapai ini, dan itu akan menyediakan milik Anda TextViewyang mengatur warna teks selalu untuk apapun yang Anda inginkan; misalnya:

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;
public class RedTextView extends TextView{
    public RedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTextColor(Color.RED);
    }
}

Kemudian, Anda hanya perlu memperlakukannya seperti biasa TextViewdalam file XML Anda:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<org.example.RedTextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

Apakah Anda menggunakan satu atau beberapa pilihan tergantung pada kebutuhan Anda. Jika satu-satunya hal yang ingin Anda lakukan adalah memodifikasi tampilan, maka pendekatan terbaik adalah yang pertama. Di sisi lain, jika Anda ingin mengubah tampilan dan menambahkan beberapa fungsionalitas baru ke widget Anda, yang kedua adalah caranya.

Cristian
sumber
menggunakan kelas khusus harus lebih disukai karena itu adalah pendekatan yang lebih bersih dan membantu menjaga bobot file xml tetap ringan.
Amit Kumar
@AmitKumar Tidak, seharusnya tidak! Dalam kasus khusus ini, ini berarti menggunakan kelas kustom terpisah untuk setiap nilai atribut yang berbeda. Ini menghasilkan banyak kode yang membengkak dan membuat tata letak sebenarnya tidak dapat dibaca lagi (Anda harus mengunjungi setiap kelas untuk melihat apa yang dilakukannya, bukan hanya membaca beberapa baris xml). Kelas khusus sebaiknya hanya digunakan jika Anda mengubah perilakunya, tetapi tidak jika satu-satunya perubahan adalah tampilan tampilan.
Andre
Apakah tidak mungkin menyetel gaya tampilan kustom dari xml? Mengapa kami tidak dapat menggunakannya dalam custom_view_layout.xmlfile yang digunakan untuk memekarkan kelas khusus?
lucidbrot
5

Untuk warna teks default di TextView, setel android:textColorTertiarytema Anda ke warna yang diinginkan:

<item name="android:textColorTertiary">@color/your_text_color</item>

Banyak warna kontrol Android lainnya dapat dikontrol menggunakan atribut framework, atau atribut support library jika Anda menggunakan support library.

Untuk daftar atribut Anda dapat mengatur, memeriksa Android kode sumber dari styles.xmldan themes.xmlatau ini sangat membantu inti oleh Dan Lew, cobalah mengubah setiap nilai dan melihat apa yang mereka mengubah pada layar.

hidro
sumber
Terima kasih bung! Saya menghabiskan banyak waktu untuk mencari tahu mengapa textColorPrimary tidak berfungsi.
pratt
3

Tentukan gaya dan gunakan di setiap widget, tentukan tema yang menggantikan default android untuk widget itu, atau tentukan sumber daya string dan referensikan di setiap widget

TWH
sumber