IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

[Android] AddListenerOnButton sur une centaine de boutons


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Par défaut [Android] AddListenerOnButton sur une centaine de boutons
    Bonjour,

    Je suis débutant sur Java et je développe une appli Android pour smartphones avec Android Studio.
    Voici mon problème :

    Dans mon GridLayout j'ai une centaine de boutons cliquables.
    Quand l'utilisateur clique (ou touche) un bouton quelconque du layout, je le masque pour qu'il ne soit plus visible.
    Ca, ça fonctionne, je joue sur la transparence et le background du layout, mais ça marche si j'ai instancié et défini le bouton dans le XML de l'app par un ID.
    Mais je voudrais éviter de faire ça pour les 100 boutons dans le XML et avoir à les appeler 100 fois dans Java, trop fastidieux...

    Existe-t-il une manière ou une méthode pour spécifier dans Java de faire appel au Listener sur n'importe quel bouton sans l'avoir instancié précédemment ?

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    import android.graphics.Color;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.Button;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.ImageButton;
     
    public class MainActivity extends AppCompatActivity {
     
        Button boutona;
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            addListenerOnButton();
        }
     
        public void addListenerOnButton() {
     
            boutona = (Button) findViewById(R.id.boutona);
     
            boutona.setOnClickListener(new OnClickListener() {
     
                @Override
                public void onClick(View arg0) {
                /* Les 2 actions effacent le texte et affectent la couleur du background au btn */
                boutona.getBackground().setAlpha(0);
                boutona.setTextColor(Color.parseColor("#2aa17b"));
     
                return;
                }
            });
     
        }
    Merci pour vos réponses

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Le listener reçoit en paramètre le widget qui a généré l'évènement.
    Du coup au lieu d'utiliser une variable d'instance il te suffit d'utiliser le paramètre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    OnClickListener hideOnClick= new OnClickListener() {
    	@Override
    	public void onClick(View view) {
    		/* Les 2 actions effacent le texte et affectent la couleur du background au btn */
    		view.getBackground().setAlpha(0);
     		view.setTextColor(Color.parseColor("#2aa17b"));
    	}
    };
     
    // puis pour tous tes boutons :
    button.setOnClickListener(hideOnClick);

    a++

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,



    Le listener reçoit en paramètre le widget qui a généré l'évènement.
    Du coup au lieu d'utiliser une variable d'instance il te suffit d'utiliser le paramètre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    OnClickListener hideOnClick= new OnClickListener() {
    	@Override
    	public void onClick(View view) {
    		/* Les 2 actions effacent le texte et affectent la couleur du background au btn */
    		view.getBackground().setAlpha(0);
     		view.setTextColor(Color.parseColor("#2aa17b"));
    	}
    };
     
    // puis pour tous tes boutons :
    button.setOnClickListener(hideOnClick);

    a++
    Merci pour ta réponse.
    Le view.setTextColor ne passe pas, 'cannot resolve method'
    Le view.getBackground fonctionne, le bouton devient transparent comme prévu mais seulement pour le premier bouton

    A quel endroit dans le code faut-il insérer l'instruction button.setOnClickListener(hideOnClick);

    Merci pour ton aide

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Pour le setTextColor() il faut caster le paramètre view en Button...

    Pour l'ajout du listerner c'est lorsque tu crées tes boutons...

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2018
    Messages : 10
    Par défaut
    Merci AdiGuba mais c'est trop pointu pour le novice Java que je suis, j'ai remanié l'app en utilisant une autre manière, un Array qui stocke les nom des boutons
    et une boucle qui les extrait.
    Mais j'ai un souci, l'appel des éléments de l'Array ne fonctionne pas, quand j'appuie sur un bouton,l'appli se crashe...

    Même un seul item dans l'Array comme dans l'extrait de mon code provoque le plantage.
    Mais si je code en dur le nom du bouton par son ID ça fonctionne, je déclenche l'action qui va bien.

    Qu'est ce qui ne va pas dans mon code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    public class MainActivity extends AppCompatActivity {
     
        // Step 1 Création d'un tableau Array contenant les ids déclarés ds le layout
        private static final int[] idArray = {R.id.jeton1};
     
        // Step 2 Définition du tableau Array qui prend en compte tous les boutons ids
        private Button[] jeton = new Button[idArray.length];
     
        int i;
     
        @SuppressLint("ClickableViewAccessibility")
        @Override
     
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            // Step 3 Assignation des objets du tableau Array aux boutons
            for (i=0; i <idArray.length; i++){
                jeton[i] = (Button)findViewById(idArray[i]);
                // Step 4 Action listener
     
                jeton[i].setOnTouchListener(
                        new View.OnTouchListener() {
     
                            @Override
                            public boolean onTouch(View view, MotionEvent event) {
     
                                switch (event.getAction()) {
     
                                    case MotionEvent.ACTION_UP:
                                        jeton[i].getBackground().setAlpha(0); // Crash de l'app
                                        jeton[i].setTextColor(Color.parseColor("#2aa28c"));
                                        break;
                                    case MotionEvent.ACTION_DOWN:
                                        jeton[i].getBackground().setAlpha(0);
                                        jeton[i].setTextColor(Color.parseColor("#2aa28c"));
                                        break;
                                }
     
                                return true;
                            }
     
            });
    Warning extrait du log à la compil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    07-30 09:44:24.247 24635-24635/com.example.combiendejetons W/art: Before Android 4.1, method int 
     
    android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private 
     
    method in android.widget.ListView
    Et le log du crash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    07-30 09:45:41.596 24635-24635/com.example.combiendejetons E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.namour.combiendejetons, PID: 24635
        java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
            at com.example.namour.combiendejetons.MainActivity$1.onTouch(MainActivity.java:48)
            at android.view.View.dispatchTouchEvent(View.java:8389)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2430)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2119)
    Merci pour le temps consacré.

Discussions similaires

  1. [ANDROID] listener sur une preference
    Par moudjames23 dans le forum Android
    Réponses: 2
    Dernier message: 21/07/2015, 15h06
  2. [GD] écrire sur une centaine d'images d'un coup avec PHP!
    Par 2ememain.biz dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 29/10/2012, 00h31
  3. [Android]Zoom sur une carte avec numéro de tuile
    Par chico95 dans le forum IGN API Géoportail
    Réponses: 4
    Dernier message: 27/08/2012, 22h26
  4. Style XP sur une fenêtre et bouton 'personnalisé'
    Par Sunchaser dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/07/2007, 00h30
  5. Evénement sur une inputbox sans bouton ?
    Par The Molo dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 30/04/2007, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo