Impostazione degli stili globali per le visualizzazioni in Android


Risposte:


250

In realtà, puoi impostare uno stile predefinito per TextViews (e la maggior parte degli altri widget incorporati) senza la necessità di eseguire una classe java personalizzata o impostare lo stile individualmente.

Se dai un'occhiata themes.xmlal sorgente Android, vedrai una serie di attributi per lo stile predefinito per vari widget. La chiave è l' attributo textViewStyle(o editTextStyle, ecc.) Che sovrascrivi nel tuo tema personalizzato. Puoi sovrascriverli nel modo seguente:

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

Quindi applica quel tema alla tua applicazione in AndroidManifest.xml:

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

E tutte le visualizzazioni del testo verranno impostate sullo stile definito in MyTextViewStyle(in questo caso, grassetto e rosso)!

Questo è stato testato su dispositivi dal livello API 4 in poi e sembra funzionare alla grande.


1
La soluzione più elegante che ho visto fino ad ora.
Italo Borssatto

@Steve, se includo l'elemento <item name="android:textViewStyle">@style/MyTextViewStyle</item>nello stile MyTheme e poi applico lo stile alla mia applicazione, tutti i miei TextViewverranno visualizzati in base allo stile (anche il nome dell'applicazione nella barra delle azioni). Come risolvere il problema con la barra delle azioni? Voglio che abbia l'aspetto predefinito. Github
Maksim Dmitriev

@Steve, Come applicare entrambi i temi (barra delle azioni e widget) sull'applicazione
Pratik Butani,

Non sono sicuro di come differenziare ActionBar da altre cose. Potresti essere in grado di trovare dove è impostato il tuo stile ActionBar e poi metterlo <item name="android:textViewStyle">@style/MyTextViewStyle</item>anche lì, semplicemente indicando l'impostazione predefinita di ActionBar (o qualcosa di simile)
Steve Pomeroy

@StevePomeroy questo non funziona per me .. puoi fornire un po 'di supporto. Il mio stile per le visualizzazioni di testo rimane lo stesso. C'è un numero minimo di elementi che devo impostare o ci sono alcuni elementi che non posso impostare?
Mike

52

Ci sono due modi per farlo:

1. Utilizzo degli stili

È possibile definire i propri stili creando file XML nella res/valuesdirectory. Quindi, supponiamo che tu voglia avere un testo rosso e in grassetto, quindi crei un file con questo contenuto:

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

Puoi nominarlo come vuoi, per esempio res/values/red.xml. Quindi, l'unica cosa che devi fare è utilizzare quella vista nei widget che desideri, ad esempio:

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

Per ulteriore riferimento, puoi leggere questo articolo: Comprensione di temi e stili Android

2. Utilizzo di classi personalizzate

Questo è un altro modo possibile per ottenere ciò, e sarebbe quello di fornire il tuo TextViewche imposta il colore del testo sempre su quello che vuoi; per esempio:

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

Quindi, devi solo trattarlo come una normale TextViewnel tuo file XML:

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

Se usi l'una o l'altra scelta dipende dalle tue esigenze. Se l'unica cosa che vuoi fare è modificare l'aspetto, l'approccio migliore è il primo. D'altra parte, se vuoi cambiare l'aspetto e aggiungere alcune nuove funzionalità ai tuoi widget, la seconda è la strada da percorrere.


l'uso di classi personalizzate dovrebbe essere preferito in quanto è un approccio più pulito e aiuta a mantenere il peso del file xml.
Amit Kumar

@AmitKumar No, non dovrebbero! In questo caso particolare, ciò significherebbe utilizzare una classe personalizzata separata per ogni diverso valore di attributo. Questo produce molto codice gonfio e rende il layout effettivo non più leggibile (dovrai visitare ogni classe per vedere cosa sta facendo invece di leggere solo poche righe xml). Le classi personalizzate dovrebbero essere usate solo se modifichi il comportamento, ma non se l'unica modifica è l'aspetto della vista.
Andre

Non è possibile impostare lo stile di una visualizzazione personalizzata da xml? Perché non possiamo usarlo nel custom_view_layout.xmlfile che viene utilizzato per gonfiare una classe personalizzata?
lucidbrot

5

Per il colore predefinito del testo TextView, imposta android:textColorTertiarynel tema il colore desiderato:

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

Molti altri colori del controllo Android possono essere controllati utilizzando attributi del framework o supportano gli attributi della libreria se si utilizza la libreria di supporto.

Per un elenco degli attributi che è possibile impostare, controllare Android il codice sorgente di styles.xmle themes.xml, o questo molto utile succo di Dan Lew, provare a cambiare ogni valore e vedere che cosa cambiano sullo schermo.


Grazie amico! Ho passato un sacco di tempo a capire perché textColorPrimary non funziona.
pratt

3

Definisci uno stile e usalo su ogni widget, definisci un tema che sovrascrive l'impostazione predefinita di Android per quel widget o definisci una risorsa stringa e fai riferimento ad essa in ogni widget

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.