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 :

Capture d'un évènement spécifique depuis une activité


Sujet :

Android

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Capture d'un évènement spécifique depuis une activité
    Je développe ma première application pour Android et je rencontre le problème suivant :

    Depuis une activité A j’instancie un objet O qui contient un champ C de type GregorianCalendar.

    Depuis l’objet O, je capte des évènements de type Gesture qui peuvent modifier l’instant encapsulé par C. Enfin je souhaite afficher, dans un TextView T de l’activité A, la date et l’heure de C.

    Bien sûr, je peux capter les évènements depuis l’activité A pour modifier alors et C et T mais, pour d’autres raisons, je souhaite conserver la gestion des évènements dans O.

    Ma question : existe-t-il un moyen de capter dans l’activité A un évènement à chaque changement de la valeur du champ C ?

    Merci pour toute réponse qui pourrait m’être utile.

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 64
    Points : 96
    Points
    96
    Par défaut
    Bonjour,
    je ne sais pas si j'ai tout saisi..tu veux afficher dans un textview de l'activité A du texte lorsque le paramètre C de l'objet O change ?

    Si c'est bien ça tu peux faire un listener :

    Une interface : OnValueChanged.java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface OnValueChanged {
        void onValueChanged(String monTexte);
    }
    Tu implémentes l'interface :
    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
    public class ActivityA extends ActionBarActivity implements OnValueChanged{
         @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_a);
     
            ObjectO mobjecto= new ObjectO(this);
       }
     
         @Override
        public void onValueChanged(String monTexte) {
             //la paramètre C vient d'être modifié, je réalise une action en conséquence
             TextView mtv = (TextView) findViewById(R.id.my_tv);
             mtv.setText(monTexte);
        }
    }
    Lorsque tu modifies ton paramètre C tu appelles le listener (au niveau du set):

    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
     
    public class ObjectO{
       private String paramC;
       private OnValueChanged listener;
     
       public ObjectO(OnValueChanged listener){
           this.paramC="";
           this.listener = listener; //fait référence à l'activité A qui implémente l'interface
       }
     
       public void setParamC(String monTexte){
           paramC = monTexte;
           listener.onValueChanged(monTexte); //on appelle la méthode qui est dans l'activité A
      }
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonsoir Estérésis,

    Et merci beaucoup pour ta réponse qui correspond tout à fait à mon problème. J'ai toutefois oublié un détail qui apporte une difficulté supplémentaire (qui n'en est peut-être pas une, j'ai encore beaucoup de choses à apprendre) :

    En fait, l'objet O est une vue qui a 3 constructeur comme il semble nécessaire pour les vues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public ObjectO(Context context) {...}
    public ObjectO(Context context, AttributeSet attrs) {...}
    public ObjectO(Context context, AttributeSet attrs, int defStyle) {...}
    et j'obtiens l'instance de O par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mobjecto = (ObjectO) findViewById(R.id.object_o);
    du fait, je ne vois pas comment passer l'écouteur OnValueChanged à O. Y a-t-il une possibilité pour le faire ?

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 64
    Points : 96
    Points
    96
    Par défaut
    Bonsoir,
    ce n'est pas un problème, le fonctionnement est le même que OnItemSelected pour des view déjà existentes telles que les listview, où même plus basique les boutons.

    Ci-dessous un exemple qui concerne la "customisation" d'un spinner (liste déroulante) ; le principe est le même pour ta view :

    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
    public class MyCustomSpinner extends Spinner {
    public MyCustomSpinner(Context context) {
        super(context);
        //constructeur de base
    }
     
    public interface MyEventListener {
        public void onEventAccured();
    }
     
    private MyEventListener mEventListener;
     
    public void setEventListener(MyEventListener mEventListener) {
        this.mEventListener = mEventListener;
    }
     
    protected void methodWichDoSmething() {
     
        // du code ...ce que la fonction doit faire
     
        if (mEventListener != null) {
            mEventListener.onEventAccured();
        }
    }
    }
    et dans ton activité A tu mets en place le listener de la même manière qu'un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MyCustomSpinner mMyCustomSpinner = (MyCustomSpinner) findViewById(R.id.my_custom_spinner);
    mMyCustomSpinner.setEventListener(new MyEventListener() {
     
                    @Override
                    public void onEventAccured() {
                        // event enclenché, faire quelque chose
                    }
                });
    J'espère que cela t'aidera.

    EDIT : implémente bien le listener dans l'activité hôte de la view au risque d'avoir des soucis de fuite de mémoire.

    Cordialement,
    Nicolas

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Avril 2015
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonsoir Nicolas,

    Et encore merci pour ta réponse. Je suis "bluffé" : ça marche parfaitement. Mais j'avoue ne pas saisir toutes les subtilités et je n'aurais jamais pu trouver sans ton aide. Il faut dire que je me suis plongé dans Java et le développement Android depuis peu et j'ai encore beaucoup de notions à apprendre...

    Voici pour information le code que j'ai implanté.

    Dans la classe ObjectO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      public interface OnValueChanged {
        void onValueChanged(ChampC champc);
      }
     
      private OnValueChanged listener;
     
      public void setEventListener(OnValueChanged listener) {
        this.listener = listener;
      };
     
    // ... plus loin ...
     
      champc.modification();
      listener.onValueChanged(champc);
    Dans la classe ActivityA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import [package].ObjectO.OnValueChanged;
    // ... plus loin ...
      mobjecto = (ObjectO) findViewById(R.id.object_o);
      mobjecto.setEventListener(new OnValueChanged() {
        @Override
        public void onValueChanged(ChampC champc) {
          mtextview.setText(String.format("[format]", champc));
        }
      });
    Encore merci pour ton aide - bonne nuit

    Yvon

  6. #6
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Estérésis t'as fait appliquer le design pattern Observer (aussi appelé Listener dans le monde Java).
    Ce pattern est utilisé intensivement pour les interfaces graphiques, mais pas que.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

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

Discussions similaires

  1. [XL-2010] Création d'une macro événement feuille depuis une macro VBA
    Par phoenellion dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/03/2013, 12h57
  2. récupérer un évènement (trigger) depuis une base
    Par omekiane dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 27/01/2010, 11h45
  3. Réponses: 4
    Dernier message: 25/11/2009, 13h55
  4. Réponses: 5
    Dernier message: 21/12/2004, 12h00
  5. Capture video depuis une carte DC30+
    Par Ertai dans le forum MFC
    Réponses: 2
    Dernier message: 19/02/2004, 15h19

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