web-dev-qa-db-fra.com

android définir le style dans le code

J'essaie d'utiliser le constructeur TextView avec un style comme celui-ci:

TextView myText = new TextView(MyActivity.this, null, R.style.my_style );

cependant, lorsque je fais cela, la vue de texte ne semble pas prendre le style (j'ai vérifié le style en le plaçant sur un objet statique).

J'ai aussi essayé d'utiliser myText.setTextAppearance(MyActivity.this, R.style.my_style) mais cela ne fonctionne pas non plus

241
Ben

Je ne crois pas que vous puissiez définir le style par programme. Pour contourner ce problème, vous pouvez créer un fichier xml de présentation de gabarit avec le style attribué. Par exemple, dans res/layout, créez tvtemplate.xml comme avec le contenu suivant:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:text="This is a template"
        style="@style/my_style" />

puis gonflez-le pour instancier votre nouveau TextView:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);

J'espère que cela t'aides.

310
Dan Kilpatrick

Vous pouvez créer un style générique et le réutiliser dans plusieurs vues de texte, comme ci-dessous:

textView.setTextAppearance(this, R.style.MyTextStyle);

Edit: this se réfère au contexte

117
Shahul3D

Vous pouvez passer un ContextThemeWrapper au constructeur comme ceci:

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
93
maxcanna

Vous pouvez définir le style dans le constructeur (mais les styles ne peuvent pas être modifiés/définis de manière dynamique).

View(Context, AttributeSet, int) (la int est une ressource de style)

Réponse de Romain Guy

référence

16
Dandre Allison

Le paramètre int defStyleAttr ne spécifie pas le style. De la documentation Android:

defStyleAttr - Attribut dans le thème actuel qui contient une référence à une ressource de style fournissant des valeurs par défaut pour la vue. Peut être 0 pour ne pas rechercher les valeurs par défaut.

Pour configurer le style dans le constructeur de View, nous avons 2 solutions possibles:

  1. Avec l'utilisation de ContextThemeWrapper:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
    
  2. Avec constructeur à quatre arguments (disponible à partir de Lollipop):

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style);
    

élément clé pour les deux solutions - defStyleAttr le paramètre doit être 0 pour appliquer notre style à la vue.

7
DmitryArc

Le changement dynamique de styles n'est pas (encore) supporté. Vous devez définir le style avant la vue est créée, via XML.

5
Chris Cashwell

La réponse acceptée était une excellente solution pour moi. La seule chose à ajouter concerne la méthode inflate().

En réponse acceptée, tous les paramètres Android:layout_* ne seront pas appliqués.

La raison n'est aucun moyen de l'ajuster, car null a été passé comme ViewGroup parent.

Vous pouvez l'utiliser comme ceci:

View view = inflater.inflate(R.layout.view, parent, false);

et la parent est la ViewGroup, à partir de laquelle vous souhaitez régler Android:layout_*.

Dans ce cas, toutes les propriétés relatives seront définies.

J'espère que ça va être utile pour quelqu'un.

2
Anor

Lorsque vous utilisez des vues personnalisées pouvant utiliser l'héritage de style (ou des attributs pouvant être stylés par un événement), vous devez modifier le second constructeur pour ne pas perdre le style. Cela a fonctionné pour moi, sans avoir besoin d'utiliser setTextAppearence ():

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}
2
saiyancoder

J'ai également rencontré le problème et j'ai trouvé le moyen de définir le style par programmation. Peut-être que vous en avez tous besoin, alors je le mets à jour.

Le troisième paramètre du constructeur View accepte un type d'attr dans votre thème en tant que code source ci-dessous:

public TextView(Context context, AttributeSet attrs) {
    this(context, attrs, com.Android.internal.R.attr.textViewStyle);
}

Donc, vous devez passer un type de R.attr. ** plutôt que R.style. **

Dans mes codes, j'ai suivi les étapes suivantes:

Commencez par personnaliser un attr personnalisé à utiliser par les thèmes du fichier attr.xml.

<attr name="radio_button_style" format="reference" />

Deuxièmement, spécifiez votre style dans votre thème utilisé dans style.xml.

 <style name="AppTheme" parent="Android:Theme.Translucent">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="radio_button_style">@style/radioButtonStyle</item>
</style>
<style name="radioButtonStyle" parent="@Android:style/Widget.CompoundButton.RadioButton">
    <item name="Android:layout_width">wrap_content</item>
    <item name="Android:layout_height">64dp</item>
    <item name="Android:background">#000</item>
    <item name="Android:button">@null</item>
    <item name="Android:gravity">center</item>
    <item name="Android:saveEnabled">false</item>
    <item name="Android:textColor">@drawable/option_text_color</item>
    <item name="Android:textSize">9sp</item>
</style>

À la fin, utilisez-le!

            RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style);

la vue créée par programme utilisera le style spécifié dans votre thème.

Vous pouvez essayer et espérer que cela fonctionnera parfaitement pour vous.

1
mrtwo

J'ai seulement testé avec EditText mais vous pouvez utiliser la méthode

public void setBackgroundResource (int resid)

appliquer un style défini dans un fichier XML.

Sine, cette méthode appartient à View. Je pense que cela fonctionnera avec n'importe quel élément de l'interface utilisateur.

cordialement.

0
floydaddict