113 votes

Comment définir par programme un attribut de style dans une vue ?

J'obtiens une vue du XML avec le code ci-dessous :

Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);

Je voudrais définir un "style" pour le bouton. Comment puis-je le faire en Java puisque je veux utiliser plusieurs styles pour chaque bouton que j'utiliserai.

59voto

beetstra Points 2246

Tout d'abord, vous n'avez pas besoin d'utiliser un inflateur de mise en page pour créer un simple bouton. Vous pouvez simplement utiliser :

button = new Button(context);

Si vous voulez donner un style au bouton, vous avez deux possibilités : la plus simple est de spécifier tous les éléments en code, comme le suggèrent de nombreuses autres réponses :

button.setTextColor(Color.RED);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);

L'autre option consiste à définir le style en XML et à l'appliquer au bouton. Dans le cas général, vous pouvez utiliser un ContextThemeWrapper pour ça :

ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle);
button = new Button(newContext);

Pour modifier les attributs liés au texte sur un TextView (ou ses sous-classes comme le bouton), il existe une méthode spéciale :

button.setTextAppearance(R.style.MyTextStyle);

Ou, si vous avez besoin de prendre en charge les appareils pré API-23 (Android 6.0)

button.setTextAppearance(context, R.style.MyTextStyle);

Cette méthode ne peut pas être utilisée pour modifier tous les attributs ; par exemple, pour modifier le rembourrage, il faut utiliser un fichier ContextThemeWrapper . Mais pour la couleur du texte, la taille, etc. vous pouvez utiliser setTextAppearance .

2 votes

Tout simplement génial. ContextThemeWrapper - est ce que je cherchais depuis si longtemps.

0 votes

Cela fonctionne à merveille. J'ai cherché cette solution pendant un certain temps.

0 votes

Cette version de setTextAppearance a été dépréciée. Vous pouvez simplement utiliser button.setTextAppearance(R.style.MyTextStyle) ;

54voto

Christopher Orr Points 58514

En général, vous ne pouvez pas modifier les styles par programme ; vous pouvez définir l'aspect d'un écran, d'une partie d'une mise en page ou d'un bouton individuel dans votre mise en page XML en utilisant thèmes ou styles . Les thèmes peuvent cependant, être appliqué de manière programmatique .

Il existe aussi une chose telle qu'un StateListDrawable ce qui vous permet de définir des objets à dessiner différents pour chaque état de l'ordinateur. Button peuvent se trouver, qu'ils soient focalisés, sélectionnés, appuyés, désactivés, etc.

Par exemple, pour que votre bouton change de couleur lorsqu'il est pressé, vous pouvez définir un fichier XML appelé res/drawable/my_button.xml un répertoire comme celui-ci :

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:state_pressed="true"
    android:drawable="@drawable/btn_pressed" />
  <item
    android:state_pressed="false"
    android:drawable="@drawable/btn_normal" />
</selector>

Vous pouvez ensuite appliquer ce sélecteur à un Button en définissant la propriété android:background="@drawable/my_button" .

4 votes

Mon problème est que je charge des données à partir d'un webservice qui décrit les informations de mon bouton. Les boutons doivent avoir un style différent en fonction de la catégorie à laquelle ils appartiennent. C'est pourquoi je voudrais définir le style de manière dynamique.

3 votes

Eh bien, vous ne pouvez pas changer l'Android style mais vous pouvez définir de manière programmatique l'arrière-plan d'un attribut Button comme vous pouvez le faire avec n'importe quelle autre vue, si cela suffit. En outre, en tant que Button hérite de TextView vous pouvez modifier les propriétés du texte. Il suffit de regarder la documentation de l'API pour ces éléments... developer.Android.com/reference/Android/view/

0 votes

Je pensais justement à faire ça, juste avant de vérifier si j'avais de nouvelles réponses. Merci beaucoup.

15voto

Dayerman Points 1376

Oui, vous pouvez utiliser par exemple dans un bouton

Button b = new Button(this);
b.setBackgroundResource(R.drawable.selector_test);

6 votes

Cela définira l'arrière-plan mais un style peut spécifier plus qu'un simple arrière-plan. Un grand nombre de vues (y compris les boutons) semblent avoir un constructeur qui prend un ID de style comme paramètre. Cependant, j'ai du mal à le faire fonctionner : le bouton s'affiche comme du texte, sans bordure ni rien. Ce que je pourrais faire à la place, c'est créer une mise en page contenant uniquement un bouton (avec un style spécifié), gonfler cette mise en page, puis définir le texte du bouton et tout le reste.

13voto

Kristy Welsh Points 353

Vous pouvez faire des attributs de style comme ceci :

Button myButton = new Button(this, null,android.R.attr.buttonBarButtonStyle);

à la place de :

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/btn"
    style="?android:attr/buttonBarButtonStyle"

    />

11voto

m3n0R Points 2333

Si vous utilisez la bibliothèque Support, vous pouvez simplement utiliser

TextViewCompat.setTextAppearance(textView, R.style.AppTheme_TextStyle_ButtonDefault_Whatever);

pour les TextViews et les Boutons. Il existe des classes similaires pour le reste des vues :-)

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