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

Composants graphiques Android Discussion :

Un écouteur pour plusieurs view


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Un écouteur pour plusieurs view
    Bonjour à toutes et à tous,

    Dans une application, pour attacher une icone à un marqueur, j'utilise plusieurs "ImageButton" (entre 20 et 30, voire plus) De ce que j'ai compris (jusqu'à maintenant, c'est-à-dire un tout début), il faut un écouteur par view.

    Est-il possible de n'avoir qu'un seul écouteur (comme en Pascal Objet par exemple) pour plusieurs view d'un même type et si oui, comment fait-on ?

    Merci pour vos renseignements.

    Pierre

  2. #2
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    J'ai trouvé une solution, la voici :

    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
    	ImageButton Img = null;
    	for (int j = 0; j < 4; j++) {
    		LinearLayout FntrSec04 = new LinearLayout(context);
    		FntrSec04.setOrientation(0);
    		for (int i = 0; i < 6; i++) {
    			Img = new ImageButton(context);
    			final int IndBtn = 6*j+i+1;
    			Img.setImageResource(R.drawable.marcheur32);
    			Img.setOnClickListener(new View.OnClickListener() { //Bouton Trace
    				@Override
    				public void onClick(View v) {
    					NoBtn = IndBtn;
    					Toast.makeText(context, "Bouton appuyé "+String.format("%d", NoBtn),Toast.LENGTH_SHORT).show();
    				}
    			});	
    			FntrSec04.addView(Img);
    		}
    		FntrPrinc.addView(FntrSec04);
    	}
    Cela ne ressemble pas à ce que je pensais, mais a priori, ça marche.

    Je fais une grille de 6 x 4 icônes représentées chacune par un "ImageButton". Je place les 6 en lignes dans un "LinearLayout" horizontal et les 4 "LinearLayout" résultants dans un "LinearLayout" vertical. L'astuce, si je puis m'exprimer ainsi est d'inclure dans la boucle la définition des "setOnClickListener".
    Dans la boucle, je crée un index "IndBtn" que j'incrémente à chaque nouvelle création. Quand je clique sur un "ImageButton" la fonction Toast me ressort bien l'index du bouton appuyé. Je peux ainsi utiliser cet index à l'extérieur pour afficher la bonne icône au bon endroit.

    Cela dit, je suis toujours preneur d'un solution un peu plus élégante.

    Cordialement.

    Pierre

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Ou alors:
    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
     
            View.OnClickListener listener = new View.OnClickListener() {
    				@Override
    				public void onClick(View v) {
    					Integer noBtn = v.getTag();
    					Toast.makeText(context, "Bouton appuyé "+String.format("%d", noBtn),Toast.LENGTH_SHORT).show();
    				}
            }
     
            int btnNum = 0;
    	for (int j = 0; j < 4; j++) {
    		LinearLayout fntrSec04 = new LinearLayout(context);
    		fntrSec04.setOrientation(0);
    		for (int i = 0; i < 6; i++) {
    			ImageButton img= new ImageButton(context);
                            img.setTag(Integer.valueOf(++btnNum));
    			img.setImageResource(R.drawable.marcheur32);
    			img.setOnClickListener(listener);
    			fntrSec04.addView(Img);
    		}
    		fntrSec04.addView(FntrSec04);
    	}
    Attention aux noms de variables... ils ne commencent PAS par une majuscule.

  4. #4
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci nicroman, cela me semble plus dans l'esprit de ce que je voulais faire (et qui doit être fait).

    Pour ce qui est des noms de variables, avec Eclipse, je n'ai jamais eu de problème si le nom commence par une majuscule. Ce que tu dis est un principe ou une obligation ? (auquel dernier cas, je ne vois pas pourquoi cela fonctionne chez moi).

    Cordialement.

    Pierre

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur Java / C++
    Inscrit en
    Mars 2013
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java / C++

    Informations forums :
    Inscription : Mars 2013
    Messages : 128
    Par défaut
    Bonjour ChPr,

    Concernant le nom des des variables c'est un principe, ou standard de développement, adopter par la majorité des développeurs Java je pense.

    Lorsque le nom commence par une majuscule, c'est le nom d'une classe, sinon c'est le nom d'une variable. Cela améliore la lisibilité du code, et facilite l'échange de code.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Tout comme Eclipse laisse mettre allègrement des '_' dans les noms alors que c'est aussi "interdit" par la norme.

    Il y a plein de "conventions" de la sorte qui rendent le code nettement plus "lisible" et compréhensible.

    Donc, en JAVA, les identifieurs (noms de variables, membres, fonctions) sont en camelCase (chaque nom avec majuscule accolés, le premier gardant une minuscule). Les types (Enum, Interface, Classes) sont en CamelCase (pareil avec une majuscule). Les constantes (static final) peuvent être tout en majuscule avec des '_'.

    Mais il y en a d'autre...

    Toujours dans le nommage:
    Les noms de fonction *doivent* correspondre à un verbe...
    Ainsi on ne fait pas une fonction "name()" mais "getName()", il est à noter que cette convention est une des rares non respectées par le langage lui-même.
    Les identifiants doivent être en anglais lisible. Donc, pas de variable "bl" mais "buttonList" par exemple. Les IDEs proposant l'auto-completion systématiquement, et la variable étant renommée dans le .class a la fin, il n'y a aucune raison à ne pas utiliser des identifiants longs.

    Il y a aussi des conventions dans l'écriture du code... Ainsi le scope d'une variable est important (je reprends l'exemple de ton code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ImageView iv = null;
    for (....) {
        iv = xxx;
    }
    // ICI on s'attend à ce que "iv" corresponde à quelque chose de précis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (....) {
        ImageView iv = xxx; 
        ....
    }
    // ICI, on ne risque pas d'utiliser iv à mauvais escient.
    etc...

Discussions similaires

  1. Définir layout une fois pour plusieurs views
    Par Timoune007 dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 04/07/2015, 00h16
  2. Plusieurs ViewModel pour une View: Locator?
    Par nasimpat7 dans le forum Silverlight
    Réponses: 3
    Dernier message: 15/03/2011, 17h15
  3. trigger delete pour plusieurs lignes
    Par Shabata dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/09/2009, 01h00
  4. Economie de mémoire pour plusieur images avec la même source
    Par neness dans le forum Composants VCL
    Réponses: 5
    Dernier message: 18/01/2004, 10h56
  5. Réponses: 4
    Dernier message: 06/11/2003, 10h37

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