138 votes

Définition de styles globaux pour les vues dans Android

Disons que je veux tous les TextView instances dans mon application pour avoir textColor="#ffffff" . Existe-t-il un moyen de définir ce paramètre en un seul endroit au lieu de le définir pour chaque utilisateur ? TextView ?

1 votes

J'ai mis à jour ma question pour qu'elle soit plus complète.

0 votes

Je fais quelque chose de similaire ICI !!! stackoverflow.com/questions/17103894/

275voto

Steve Pomeroy Points 3968

En fait, vous pouvez définir un style par défaut pour les TextViews (et la plupart des autres widgets intégrés) sans devoir créer une classe java personnalisée ou définir le style individuellement.

Si vous regardez dans themes.xml dans la source d'Android, vous verrez un tas d'attributs pour le style par défaut de divers widgets. La clé est l'attribut textViewStyle (ou editTextStyle etc.) que vous remplacez dans votre thème personnalisé. Vous pouvez les remplacer de la manière suivante :

Créer 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>

Il suffit ensuite d'appliquer ce thème à votre application dans AndroidManifest.xml :

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

Et toutes vos vues de texte utiliseront par défaut le style défini dans MyTextViewStyle (dans ce cas, en gras et en rouge) !

Ce système a été testé sur des appareils à partir du niveau 4 de l'API et semble fonctionner parfaitement.

1 votes

La solution la plus élégante que j'ai vue jusqu'à présent.

0 votes

@Steve, si j'inclus l'élément <item name="android:textViewStyle">@style/MyTextViewStyle</item> dans le style MonThème et ensuite appliquer le style à mon application, tous mes TextView seront affichés en fonction du style (même le nom de l'application dans la barre d'action). Comment résoudre le problème de la barre d'action ? Je veux qu'elle ait l'apparence par défaut. Github

0 votes

@Steve, Comment appliquer les deux thèmes (barre d'action et widget) sur l'application ?

53voto

Cristian Points 92147

Il y a deux façons de procéder :

1. Utilisation des styles

Vous pouvez définir vos propres styles en créant des fichiers XML sur le site Web de la Commission européenne. res/values répertoire. Ainsi, supposons que vous souhaitiez avoir du texte en rouge et en gras, alors vous créez un fichier avec ce contenu :

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

Vous pouvez le nommer comme vous le souhaitez, par exemple res/values/red.xml . Ensuite, il ne vous reste plus qu'à utiliser cette vue dans les widgets que vous souhaitez, par exemple :

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

Pour plus de références, vous pouvez lire cet article : Comprendre les thèmes et les styles Android

2. Utiliser des classes personnalisées

Il existe une autre façon d'y parvenir, qui consisterait à fournir votre propre TextView qui définissent toujours la couleur du texte comme vous le souhaitez ; par exemple :

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

Ensuite, vous devez juste le traiter comme un normal TextView dans votre fichier 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>

L'utilisation de l'un ou l'autre choix dépend de vos besoins. Si la seule chose que vous voulez faire est de modifier l'apparence, alors la meilleure approche est la première. En revanche, si vous souhaitez modifier l'apparence et ajouter de nouvelles fonctionnalités à vos widgets, la deuxième approche est la plus appropriée.

0 votes

Il est préférable d'utiliser des classes personnalisées, car il s'agit d'une approche plus propre qui permet de conserver un fichier xml léger.

0 votes

@AmitKumar Non, ils ne devraient pas ! Dans ce cas particulier, cela signifierait utiliser une classe personnalisée distincte pour chaque valeur d'attribut différente. Cela produit beaucoup de code et rend le layout actuel illisible (vous devrez visiter chaque classe pour voir ce qu'elle fait au lieu de simplement lire quelques lignes de xml). Les classes personnalisées ne devraient être utilisées que si vous modifiez le comportement, mais pas si le seul changement est l'apparence de la vue.

0 votes

N'est-il pas possible de définir le style d'une vue personnalisée à partir de xml ? Pourquoi ne pouvons-nous pas l'utiliser dans le custom_view_layout.xml qui est utilisé pour gonfler une classe personnalisée ?

5voto

hidro Points 161

Pour la couleur de texte par défaut dans TextView ensemble android:textColorTertiary dans votre thème à la couleur désirée :

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

Les couleurs de nombreux autres contrôles Android peuvent être contrôlées à l'aide d'attributs du framework, ou d'attributs de la bibliothèque de support si vous utilisez cette dernière.

Pour obtenir une liste des attributs que vous pouvez définir, consultez le site suivant Code source Android de styles.xml y themes.xml ou ce très utile Gist par Dan Lew, essayez de changer chaque valeur et voyez ce qu'elles changent à l'écran.

3voto

TWH Points 41

Définissez un style et utilisez-le sur chaque widget, définissez un thème qui remplace la valeur par défaut d'Android pour ce widget, ou définissez une ressource de type chaîne et référencez-la dans chaque widget.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X