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

Android Discussion :

Événement personnalisé et interface, je n'y arrive décidément pas, mais alors pas du tout!


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut Événement personnalisé et interface, je n'y arrive décidément pas, mais alors pas du tout!
    Bonjour à toutes et à tous,

    M'étant formé sur le tard à la POO, je suis ensuite passé sur android.
    J'ai déjà fait une app qui tourne mais certains concepts m'échappent et je trouve qu'android est une usine à gaz de laquelle je me sens prisonnier...
    Bref, pour être un peu plus précis, j'aurais besoin de comprendre un concept que je n'arrive définitivement pas à ingurgiter que sont les événements personnalisés.
    Exemple, en as3 (actionScript 3) il était très simple pour moi de créer un évenement personnalisé. Un simple dispatchEvent "monEvent" dans une classe A et il me suffisait dans une classe B d'ajouter un listener sur un Event de type "monEvent" et je pouvais faire ce que je voulais après.
    Mon problème, c'est qu'en java et particulièrement sur android, je ne comprends absolument rien aux listeners personnalisés. J'ai lu le cours avec la station météo, les capteurs température, pression, etc mais j'ai du mal et j'aurais bien aimé trouver une âme charitable qui puisse m'expliquer ça plus simplement et avec un seul événement et surtout sans tableau car votre cour empile les Events dans un tableau et ça complique encore plus les choses (pour moi). Ça fait donc une semaine que je lis des articles en français (très peu dont le votre), en anglais (stackoverflow) mais y'a rien à faire ça ne rentre pas. Je ne comprend absolument pas l'utilisation d'interface dans dans la gestion des events perso.
    J'ai réussi à faire marcher un exemple que j'ai bidouillé mais je suis obligé de déclarer mon interface en tant qu'objet static dans ma classe qui dispatch l'event.
    Ce que je dis n'est qu'un exemple, mais pour être plus clair si je ne l'ai pas été assez, j'aimerais que quelqu'un puisse m'expliquer le plus simplement possible et sous android comment je peux dispatcher un événement personnalisé donc partant d'une 'Classe A' avec l'aide d'une 'interface B' et récupérer l'event dans une 'Classe C'.
    Ais-je été suffisamment clair et est-ce qu'une personne pourrait m'aider?

    Merci beaucoup de m'avoir lu et bonne semaine à toutes et à tous,
    Eric.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Exemple, en as3 (actionScript 3) il était très simple pour moi de créer un évenement personnalisé. Un simple dispatchEvent "monEvent" dans une classe A et il me suffisait dans une classe B d'ajouter un listener sur un Event de type "monEvent" et je pouvais faire ce que je voulais après.
    Le principe est pourtant quasi identique (au vocabulaire pret) en java. C'est ce qu'on appel le pattern Observer

    Exemple :

    1- Interface
    La première chose à faire pour un événement personnalisé c'est de créer une interface. Cette interface est là pour imposer un fonctionnement au classe qui l'implémente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface OnMyEventListener {
        public abstract void onMyEvent();
    }
    En d'autre terme toutes les classe implémentant l'interface OnMyEventListener devront implémenter la méthode onMyEvent()


    2- Implémentation

    Il faut donc ensuite implémenter cette interface, c'est ce code qui sera appeler lors de l'appel de l'événement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class MyEvent implements OnMyEventListener {
        @Override
        public void onMyEvent() {
            Log.d("EVENT","EVENEMENT PERSONNALISE");
        }
    }
    Très souvent cette classe n'est pas implémenter de cette facon mais plutout sous la forme d'une inner classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private OnMyEventListener MyCustomViewListener = new OnMyEventListener () {
    	@Override
    	public void onMyEvent()
    	{
    		Log.d("EVENT","EVENEMENT PERSONNALISE");
    	}
    }
    Le résultat est le même.

    3- Utilisation de l'événement

    Cet événement personnalisé doit être appelé à un moment donné. Il faut donc dans la classe qui en à besoin ajouter un listener qui sera appelé quand c'est nécessaire. Il faut également ajouter un setter qui permet de définir l'événement concret à appeler :

    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
    class MyClass
    {
        //Listener , par defaut null tant que pas défini
        private OnMyEventListener mEventListener = null;
     
     
        public void setMyCustomEvent(OnMyEventListener listener)
        {
            mEventListener = listener;
        }
     
        private void fireCustomEvent()
        {
            if(mEventListener != null)
                mEventListener.onMyEvent(); // Appel de l'événement concret
        }
    }
    4- On relie tout ensemble

    Ne reste maintenant plus qu'à lier tout ce petit monde ensemble. Cette partie se fait très souvent dans une activity.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyClass maClasse = new MyClass(); // Instance de la classe
    MyEvent event = new MyEvent(); // Instance de l'événement
    maClasse.setMyCustomEvent(event); // On donne l'événement concret à la classe
    maClasse.fireCustomEvent(); // on déclenche l'événement
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    Bonjour Grunk,

    Mille merci pour votre réponse que je découvre à l'instant.
    Étant en Thaïlande (gmt +7), j'ingurgite le tout demain matin et je reviens vers vous car il est ici presque minuit.
    Merci sincèrement de m'avoir répondu.

    Bonne soirée à vous ainsi qu'à tous,
    Eric.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    Bonjour grunk,

    Tout d'abord, mes excuses, je reviens avec un jour de retard.

    Je vous remercie beaucoup pour votre exemple détaillé qui m'a permis de faire fonctionner cet écouteur personnalisé.

    Dans la partie 2 implémentation, c'est bien sûr la première façon de procéder que je préfère, je déteste dans la seconde façon le fait de déclarer NEW une interface car on instancie pas une interface.
    J'ai bien compris qu'on instanciait une inner classe qu implémente l'interface mais ça m'embrouille et c'est d'ailleurs peut-être ce qui fait que je ne comprenais rien du tout.
    Bon j'ai réussi à adapter votre exemple sur mon code, ne me reste plus qu'à bien décortiquer pour bien me mettre ça dans la tête.
    Oui, je fais partie de gens qui comprennent pas vite mais quand j'ai compris un principe, je ne l'oublie jamais!

    Pas impossible que je revienne pour une petite question mais un vrai grand MERCI à vous grunk d'avoir eu la gentillesse de prendre le temps de m'expliquer!

    Je vous souhaite une belle fin de semaine,
    Eric.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    Bonjour grunk et bonjour à tous,

    Je reviens vers vous car j'ai un peu réfléchis sur le sujet et j'aurais deux questions...

    La première et en suivant votre exemple, pourquoi dans la partie

    3- Utilisation de l'événement et dans la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setMyCustomEvent(OnMyEventListener listener)
        {
            mEventListener = listener;
        }
    où vous êtes sensé fournir une variable de type OnMyEventListener (donc l'interface) vous lui fournissez un objet de type classe (qui implémente l'interface, soit) mais qui est une classe.
    Donc pour faire plus simple, la méthode setMyCustomEvent attend un paramètre de type interface et vous lui fournissez un paramètre de type classe comme fait dans la partie 4 de votre exemple, POURQUOI?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyEvent event = new MyEvent(); // Instance de l'événement
    maClasse.setMyCustomEvent(event); // On donne l'événement concret à la classe



    Seconde question, pourquoi utiliser une interface, pourquoi ne pas faire ce que j'écris en dessous en reprenant votre exemple? qu'est-ce qui change dans l'exemple que je donne ci-dessous, qu'est-ce qu'impliquerait le raccourci que je prend en supprimant l'interface, avez-vous un exemple de cas où cela serait ennuyeux?

    Désolé d'être un peu long mais c'est vraiment pour comprendre le mieux possible et puis ça pourrait peut-être aider aussi ceux qui comme moi sont long à comprendre...

    Merci à vous grunk et merci à tous,
    Eric.


    1- Interface
    Je la supprime, plus d'interface.


    2- Implémentation

    je n'implémente plus l'interface, je laisse la fonction mais je ne l'override plus donc hein.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class MyEvent {
     
        public void onMyEvent() {
            Log.d("EVENT","EVENEMENT PERSONNALISE");
        }
    }
    3- Utilisation de l'événement

    plus de listener, j'appelle simplement la fonction onMyEvent() au moment opportun, c'est à dire au moment où je le décide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MyClass
    {
     
        private void fireCustomEvent()
        {
            MyEvent.onMyEvent(); // Appel de l'événement concret
        }
    }
    4- On relie tout ensemble

    Ne reste maintenant plus qu'à lier tout ce petit monde ensemble. Cette partie se fait très souvent dans une activity.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyClass maClasse = new MyClass(); // Instance de la classe
    MyEvent event = new MyEvent(); // Instance de l'événement
    maClasse.fireCustomEvent(); // on déclenche l'événement

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2018
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2018
    Messages : 63
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    L'utilisation d'une interface va permettre aux classes qui l'implémente de respecter les règles de cette dernière (Oui car c'est une classe abstraite).
    Je m'explique :
    - Lorsque tu implémentes une interface, tu dois forcément implémenter ses méthodes.
    - Entre deux classes qui implémente la même interface, tu peux te retrouver avec des utilisations différentes des méthodes de l'interface, c'est ça l'intérêt !

    Avec un exemple concret :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Outils{
      public void dessiner();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Triangle implements Outils{
      public void dessiner(){
        //dessiner un triangle
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Rectangle implements Outils{
      public void dessiner(){
        //dessiner un rectangle
    }
    }
    Pour cet exemple on aurait tout de même pu utiliser un héritage, mais c'est pour te montrer le principe,
    Pour rappel :

    "implements" implémente une (ou plusieurs) interface
    "extends" étend une (seule) classe

  7. #7
    Membre éprouvé Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Points : 1 014
    Points
    1 014
    Par défaut

    Je peux répondre à la première partie de ta question. Pour la deuxième je vais laisser des gens plus expert te répondre.

    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void setMyCustomEvent(OnMyEventListener listener)
        {
            mEventListener = listener;
        }
    Tu n'attends pas une interface comme paramètre. Tu attends un objet, donc une instance de classe. Cette écriture indique que l'objet que tu attends doit être une instance d'une classe qui implémente l'interface. Mais pour reprendre tes mots tu attends bien "un argument de type classe". C'est jsute que cette classe doit implémnter l'interface.

    On fait cela pour augmenter la souplesse du code. C'est une pratique que l'on voit souvent avec les listes par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<int> myList = new ArrayList<int>();
    List<int> my2ndList = new LinkedList<int>();
    Ici List est une interface et ArrayList/LinkedList sont des classes qui implémentent l'interface List.
    Si par exemple je veux créer une fonction qui retourne le premier élément d'une liste et ceux peu importe que ce soit une ArrayList ou une Linked list ou autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int premierElement(List<int> liste){
        return liste.get(0);
    }
    Le fait d'utiliser l'interface pour définir le paramêtre me permet d'accepter n'importe quel objet qui implémente l'interface List, donc je peux autant accepeter une ArrayList qu'une LinkedList.




    L'idée dans ton problème est la même, Ta classe MyClass s'attends à un listener qui implémente OnMyEventListener. Peut-être que plus tard tu auras besoin d'utiliser un Listener qui réagit au même évènement mais qui fait une chose différente. Tu auras donc défini une autre classe que MyEvent. Mais tu n'auras pas besoin de redéfinir une fonction setMyCustomEventListerner car elle acceptera aussi cette nouvelle classe en paramêtre
    "On sera toujours mieux installé assis en 1ère que debout en 2nde", un illustre inconnu


    Avant de poser une question vérifiez si elle n'a pas déjà une réponse dans les cours et tutoriels
    Si votre problème est pensez à marquer la conversation comme telle
    Si un message est utile, pertinent, et/ou vous êtes d'accord avec, pensez à à l'inverse s'il est inutile, faux ou que vous n'êtes pas d'accord, pensez à

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    Bonjour à toutes et à tous,

    Tout d'abord, merci à Kamenber et à Drowan pour vos explications.

    Merci Kamenber pour votre réponse, c'est clair.

    Merci à vous aussi Drowan, j'ai bien compris votre exemple et son utilité.

    Bon week-end à vous ainsi qu'à tous,
    Eric.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Google I/O : une nouvelle interface pour Google Maps arrive
    Par Linunix dans le forum Actualités
    Réponses: 2
    Dernier message: 17/05/2013, 10h05
  2. Évènement personnalisé d'un Dragger
    Par Ed.11 dans le forum Qt
    Réponses: 0
    Dernier message: 26/05/2011, 18h29
  3. Créer un événement personnalisé
    Par samalairbien dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/04/2009, 11h46
  4. Redirection d'un évènement personnalisé
    Par Greg767 dans le forum wxWidgets
    Réponses: 4
    Dernier message: 21/08/2008, 14h47
  5. Interface : je n'y arrive pas
    Par Cazaux-Moutou-Philippe dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 17/06/2008, 22h59

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