Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Appliquer un style à un bouton

Créer et utiliser un AttributeSet

Sujet résolu
    12 novembre 2013 à 12:20:31

    Bonjour à tous,

    Je débute dans le développement Android et j'ai donc décider de suivre le cours de Apollidore mais j'ai néanmoins besoin de votre aide pour la partie sur les styles. Je l'ai lu et essayer de faire pareil mais malheureusement je n'y suis pas parvenu.

    Le constructeur d'une vue est : public View (Context contexte, AttributeSet attrs).

    J'ai créer un style comme indiqué dans le tutoriel, jusque là pas de problème. Sauf que sur le tuto il envoi directement son style en paramètre AttributeSet.

    Alors que mon style renvoi un int et donc pas un AttributeSet!

    J'ai essayé plusieurs fois sans succès.

    Voilà mon code si ça peut aider :

    MainActivity.java :

    package com.example.test;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.AttributeSet;
    import android.view.Menu;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    	LinearLayout layout;
    	TextView textView;
    	EditText editText;
    	Button button;
    	CheckBox checkBox;
    	
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            layout = new LinearLayout(this);
            layout.setOrientation(LinearLayout.VERTICAL);
            
            textView = new TextView(this);
            textView.setText("Voici mon TextView");
            
            editText = new EditText(this);
            editText.setHint("Inscrire du texte");
            editText.setLines(2);
            
            button = new Button(this, R.style.texte_rouge_grand);// Le problème
            button.setText("Mon bouton");
            
            checkBox = new CheckBox(this);
            checkBox.setText("Ma CheckBox");
            checkBox.setSelected(true);
            
            layout.addView(textView);
            layout.addView(editText);
            layout.addView(button);
            layout.addView(checkBox);
            
            setContentView(layout);
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        
    }
    

    styles.xml :

    <resources xmlns:android="http://schemas.android.com/apk/res/android">
        <!--
            Base application theme, dependent on API level. This theme is replaced
            by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
        -->
        <style name="AppBaseTheme" parent="android:Theme.Light">
            <!--
                Theme customizations available in newer API levels can go in
                res/values-vXX/styles.xml, while customizations related to
                backward-compatibility can go here.
            -->
        </style>
    
        <!-- Application theme. -->
        <style name="AppTheme" parent="AppBaseTheme">
            <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        </style>
        
        <style name="texte_cyan">
      <item name="android:textColor">#00FFFF</item>
    </style>
    
    	<style name="texte_cyan_grand" parent="texte_cyan">
      <!-- On récupère la couleur du texte définie par le parent -->
      <item name="android:textSize">20sp</item>
    </style>
    
    	<style name="texte_rouge_grand" parent="texte_cyan_grand">
      <!-- On écrase la couleur du texte définie par le parent, mais on garde la taille -->
      <item name="android:textColor">#FF0000</item>
    </style>
    
    </resources>
    

    Si quelqu'un pourrait m’éclaircir sur la façon de créer un AttributeSet ce serait cool!

    Merci d'avance pour m'avoir consacré votre temps!!!

    -
    Edité par jeremie40000 12 novembre 2013 à 12:23:11

    • Partager sur Facebook
    • Partager sur Twitter
      12 novembre 2013 à 13:16:24

      Salut,

      Je pense que tu t'es trompé de version du constructeur. Celui qui t'intéresse me semble plutôt être public View (Context context, AttributeSet attrs, int defStyleAttr)defStyleAttr est ce que tu veux passer. Non ?

      -
      Edité par Kayl 12 novembre 2013 à 13:17:57

      • Partager sur Facebook
      • Partager sur Twitter
        12 novembre 2013 à 19:30:29

        Tout d'abord, je voudrai te remercier de m'avoir répondu!

        J'ai donc essayer en remplaçant cette ligne :

        button = new Button(this, R.style.texte_rouge_grand);

        Par celle-ci :

        button = new Button(this, null, R.style.texte_rouge_grand);

        Ce qui me donne le résultat suivant(en affichant seulement le Button) :

        alors que le bouton de base ressemble plutôt à ça :

        Mon but était simplement de redéfinir la couleur du texte alors qu'il m'a redéfinit le style en entier!

        • Partager sur Facebook
        • Partager sur Twitter
          13 novembre 2013 à 1:24:21

          Le problème est double :

          • L'utilisation de defStyleAttr est loin d'être triviale
          • Aucun de tes styles n'héritent de @android:style/Widget.Button donc même si ça marchait, tu aurais le texte rouge mais tu perdrais le background du bouton
          Relisons la doc :

          defStyleAttr An attribute in the current theme that contains a reference to a style resource to apply to this view. If 0, no default style will be applied.

          Il faut donc, dans le thème courant, avoir un attribut qui pointe vers un style.

          Donc on modifie l'XML comme suit:

          <declare-styleable name="TestTheme">
              <attr name="redButtonStyle" format="reference"/>
          </declare-styleable>
          
          <!-- Application theme. -->
          <style name="AppTheme" parent="AppBaseTheme">
              <item name="redButtonStyle">@style/texte_rouge_grand</item>
          </style>

          On a donc bien défini un attribut avec declare-styleable et on a défini une valeur pour cet attribut dans le thème courant AppTheme.

          Maintenant, comme je te l'ai dit, ton deuxième problème est que ton style n'est pas applicable à un bouton car il n'hérite pas du bon parent. Je te laisse faire le ménage dans tes styles mais grosso modo la modification suivante suffit :

          <style name="texte_cyan" parent="@android:style/Widget.Button">
            <item name="android:textColor">#00FFFF</item>
          </style>

          Testé sur Android 2.3.7 & 4.2.1 sans problème, enjoy :)

          Référence : le topic de stackoverflow qui m'a permis de comprendre ton problème

          -
          Edité par Kayl 13 novembre 2013 à 1:27:55

          • Partager sur Facebook
          • Partager sur Twitter
            13 novembre 2013 à 15:40:04

            Je te remercie encore Kayl mais le problème persiste encore, après avoir suivi tes conseils, j'obtiens un fichier styles.xml comme suit :

            <resources xmlns:android="http://schemas.android.com/apk/res/android">
                <!--
                    Base application theme, dependent on API level. This theme is replaced
                    by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
                -->
                <style name="AppBaseTheme" parent="android:Theme.Light">
                    <!--
                        Theme customizations available in newer API levels can go in
                        res/values-vXX/styles.xml, while customizations related to
                        backward-compatibility can go here.
                    -->
                </style>
                
                <style name="texte_cyan" parent="@android:style/Widget.Button">
              <item name="android:textColor">#00FFFF</item>
            </style>
            
            	<style name="texte_cyan_grand" parent="texte_cyan">
              <item name="android:textSize">20sp</item>
            </style>
            
            	<style name="texte_rouge_grand" parent="texte_cyan_grand">
              <item name="android:textColor">#FF0000</item>
            </style>
            
                <declare-styleable name="TestTheme">
                    <attr name="redButtonStyle" format="reference"/>
                </declare-styleable>
                
                <!-- Application theme. -->
                <style name="AppTheme" parent="AppBaseTheme">
                    <item name="redButtonStyle">@style/texte_rouge_grand</item>
                </style>
                
                
            </resources>
            

            Dis moi si j'ai mal interprété tes conseils. Je n'ai rien changé à mon fichier java, voici la seul ligne importante :

            button = new Button(this, null, R.style.texte_rouge_grand);



            Je suis sûr que l'erreur doit être banal mais je n'arrive pas à la trouver, mon Button reste comme avant(sans background).

            • Partager sur Facebook
            • Partager sur Twitter
              13 novembre 2013 à 16:38:57

              Oui pardon c'est ma faute, j'ai oublié de te copier une ligne, la plus importante en effet, qui ne doit pas référencer le style mais bien l'attribut, dont la valeur pointe vers le style (nuance):

               button = new Button(this, null, R.attr.redButtonStyle);



              • Partager sur Facebook
              • Partager sur Twitter
                13 novembre 2013 à 17:07:23

                CA MARCHE!!!!!!!

                TROP COOL MEC MERCI KAYL!!!!!!!!:D:D:D

                -
                Edité par jeremie40000 13 novembre 2013 à 17:08:33

                • Partager sur Facebook
                • Partager sur Twitter

                [Android] Appliquer un style à un bouton

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown