vince123 Posté(e) 9 juin 2010 Share Posté(e) 9 juin 2010 Bonjour à toutes et à tous, J'aimerai récupérer un click d'un FrameLayout (qui est le parent), donc en gros un clic sur n'importe qu'elle endroit de ma fenêtre. Lorsque je clique, il ne se passe rien Voila ce que j'ai : public void onCreate(Bundle savedInstanceState) { .......etc......etc findViewById(R.id.frame).setOnClickListener(new View.OnClickListener() { public void onClick(View v) { handleClick(v); } }); } public void handleClick(View v) { // Gérer le clic Toast.makeText(Article.this, "menu_clicked",Toast.LENGTH_SHORT).show(); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cyril Mottier Posté(e) 9 juin 2010 Share Posté(e) 9 juin 2010 Tu es sur que ton click n'est pas récupéré par un élément fils ? Un bouton par exemple ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 9 juin 2010 Auteur Share Posté(e) 9 juin 2010 s sur que ton click n'est pas récupéré par un élément fils ? Un bouton Salut Cyril, oui je suis sur. FrameLayout ScrollView Relative 1....etc Fin Scrollview Fin FrameLayout Merci ^^ ps : si tu te souviens de moi, je t'avais demandé par mail comment modifier l'image d'une horloge...et que mon adresse était considérée comme un spam Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fluckysan Posté(e) 9 juin 2010 Share Posté(e) 9 juin 2010 Essaye de mettre des OnClickListener sur les fils pour tracer le click Si celui-ci n'atteint pas ton FrameLayout, c'est qu'il est consommé avant (sachant que l'évènement click "remonte" des fils jusqu'au père) Essaye aussi de lancer ton appli en mode debug avec des points d'arrêts :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cyril Mottier Posté(e) 10 juin 2010 Share Posté(e) 10 juin 2010 C'est tout à fait normal que tu n'ai pas de click puisque ta ScrollView doit le consommer. Comme je l'ai dit dans mon premier post :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 10 juin 2010 Auteur Share Posté(e) 10 juin 2010 Essaye de mettre des OnClickListener sur les fils pour tracer le clickSi celui-ci n'atteint pas ton FrameLayout, c'est qu'il est consommé avant (sachant que l'évènement click "remonte" des fils jusqu'au père) Essaye aussi de lancer ton appli en mode debug avec des points d'arrêts :) Fluckysan, je suis d'accord, mais que veux-tu dire par "tracer le click" ? :/ ps : je n'ai jamais utilisé de mode debug, seulement des "log.d" ou autre :( C'est tout à fait normal que tu n'ai pas de click puisque ta ScrollView doit le consommer. Comme je l'ai dit dans mon premier post :) Cyril, j'ai déjà essayer sur la ScrollView, mais idem, il ne récupère pas mon clique.... :o La seule chose que j'arrive à faire, c'est mettre des évènements click sur les fils du Scrollview, c'est à dire sur mes RelativeLayout.... Donc je sais plus trop quoi faire edit : En fait je veux récupérer 2 évènements de click sur mon FrameLayout ou sur ma fenêtre ou sur mon activity (appelez-ça comme vous voulez :) :) ) : 1) 1 click simple et court 2) un click de type scroll Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nanis Posté(e) 10 juin 2010 Share Posté(e) 10 juin 2010 si ton framelayout contient une scrollview, et uniquement cela, pourquoi ne pas plutôt écouter les clic sur celle ci ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 10 juin 2010 Auteur Share Posté(e) 10 juin 2010 si ton framelayout contient une scrollview, et uniquement cela, pourquoi ne pas plutôt écouter les clic sur celle ci ? Parce que c'est pareille, je n'arrive pas à récupérer des click sur ma ScrollView :mad: Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 10 juin 2010 Share Posté(e) 10 juin 2010 Au final tu veux obtenir quoi en fait ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 10 juin 2010 Auteur Share Posté(e) 10 juin 2010 Au final tu veux obtenir quoi en fait ? un clique de type "click court" sur ma fenêtre affiche un menu (RelativeLayout) un clique de type "scroll" me cache mon menu Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cyril Mottier Posté(e) 10 juin 2010 Share Posté(e) 10 juin 2010 Tu est bien sûr que ton FrameLayout est "isClickable()"? Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 10 juin 2010 Auteur Share Posté(e) 10 juin 2010 Tu est bien sûr que ton FrameLayout est "isClickable()"? oui, il est à true : edit : oups je pense que je n'ai pas répondu à ta question :| :| !! Tu parles de code java ? si c'est ça alors non !! xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/frame" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/bg" android:clickable="true"> dans mon onCreate : mFrameLayout = (FrameLayout)findViewById(R.id.frame); mFrameLayout.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { handleClick(v); } }); } puis : public void handleClick(View v) { // Gérer le clic Log.i(TAG, "c"); Toast.makeText(Article.this, "menu_clicked",Toast.LENGTH_SHORT).show(); Log.i(TAG, "d"); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 11 juin 2010 Auteur Share Posté(e) 11 juin 2010 aie, personne pour m'aider ? :| :| Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 11 juin 2010 Share Posté(e) 11 juin 2010 Tu as essayé ça ? http://d.android.com/reference/android/widget/ScrollView.html#onInterceptTouchEvent%28android.view.MotionEvent%29 Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 11 juin 2010 Auteur Share Posté(e) 11 juin 2010 Tu as essayé ça ?http://d.android.com/reference/android/widget/ScrollView.html#onInterceptTouchEvent%28android.view.MotionEvent%29 non, je vais de ce pas tester le : onInterceptTouchEvent() edit : rectification, je l'avais tester, notamment grâce à ceci : http://android.cyrilmottier.com/?p=96 Je ne peux pas essayer de récupérer un click direct sur l'activity ?! :/ Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fluckysan Posté(e) 11 juin 2010 Share Posté(e) 11 juin 2010 Pour le mode debug : tu double click dans la marge (là où il y a le numéro de ligne) pour placer tes points d'arrêts Ensuite tu lances ton appli en mode debug (le bouton avec l'insecte :o), Eclipse arrêtera l'exécution de ton application lorsqu'un point d'arrêt est atteint Je te conseille aussi d'ouvrir la perspective debug qui est pratique (pour voir les valeurs de tes variables par exemple) Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 11 juin 2010 Auteur Share Posté(e) 11 juin 2010 Pour le mode debug : tu double click dans la marge (là où il y a le numéro de ligne) pour placer tes points d'arrêtsEnsuite tu lances ton appli en mode debug (le bouton avec l'insecte :o), Eclipse arrêtera l'exécution de ton application lorsqu'un point d'arrêt est atteint Je te conseille aussi d'ouvrir la perspective debug qui est pratique (pour voir les valeurs de tes variables par exemple) A ok, merci :) edit : J'arrive à récupérer mes clicks mais que sur ma title bar ( :o :o :o :o :o :o ), grâce à ceci : @Override public boolean onTouchEvent(MotionEvent event) { /* * Récupère l'action effectuée et sa position */ final int action = event.getAction(); final float x = event.getX(); final float y = event.getY(); switch (action) { case MotionEvent.ACTION_DOWN: /* * L'utilisateur vient d'appuyer sur la vue. Si l'appui * s'effectue sur le fichier et que la poubelles est vide on * peut démarrer le "dragging" en initialisant les variables * utiles par la suite */ Toast.makeText(Article.this, "appui sur la vue",Toast.LENGTH_SHORT).show(); /* * On retourne true afin que l'ensemble des évènements * suivants nous parviennent */ return true; case MotionEvent.ACTION_MOVE: /* * L'utilisateur est en train de bouger son doigt sur l'écran. * On effectue simplement le déplacement de l'image du fichier * texte à la position du doigt */ Toast.makeText(Article.this, "bouge le doigt",Toast.LENGTH_SHORT).show(); // mFileX = x - mDeltaX; // mFileY = y - mDeltaY; /* * On invalide la vue afin de dessiner l'image du fichier au * nouvel endroit. La méthode appellée est expliquée plus bas. */ return true; case MotionEvent.ACTION_UP: /* * L'utilisateur vient de relacher la pression sur l'écran. */ Toast.makeText(Article.this, "relache la pression",Toast.LENGTH_SHORT).show(); return true; } return super.onTouchEvent(event); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nivek Posté(e) 11 juin 2010 Share Posté(e) 11 juin 2010 Ca me semble logique, c'est le seul composant graphique qui doit être géré directement par l'activity. Le hic c'est que tous les autres événements sont CONSOMMES par les items de la scrollview ou la scrollview elle-même, tu n'as aucune chance de les recevoir en dehors de l'interception évoquée plus haut. Quels problèmes as-tu rencontrés avec l'interception ? Je pense qu'on doit assez facilement obtenir ce que tu veux. Lien vers le commentaire Partager sur d’autres sites More sharing options...
vince123 Posté(e) 11 juin 2010 Auteur Share Posté(e) 11 juin 2010 Ca me semble logique, c'est le seul composant graphique qui doit être géré directement par l'activity.Le hic c'est que tous les autres événements sont CONSOMMES par les items de la scrollview ou la scrollview elle-même, tu n'as aucune chance de les recevoir en dehors de l'interception évoquée plus haut. Quels problèmes as-tu rencontrés avec l'interception ? Je pense qu'on doit assez facilement obtenir ce que tu veux. J'ai réussi, mais d'une autre manière, je vais éditer et expliquer !! :P :P edit : rappel de l'arborescence de mon xml : FrameLayout ScrollView, RelativeLayout, RelativeLayout Sachant que mes 2 relatives sont 2 menus qui apparaissent simultanément en haut et en bas de ma fenêtre Dans mon .java (finalement je vais pointer sur ma ScrollView et non pas sur le père des pères qui est le FrameLayout :/ . Bien entendu, maintenant ma ScrollView ne remplis plus son rôle :o !! donc utilisation de "return super.onTouchEvent(event);" pour retrouver l'utilisation de la ScrollView.....à bon entendeur : je déclare => private ScrollView mScrollView; mise en place du listener dans le onCreate => mScrollView = (ScrollView)findViewById(R.id.scrollview); mScrollView.setOnTouchListener(this); enfin => public boolean onTouch(View v, MotionEvent event) { final int action = event.getAction(); final float x = event.getX(); final float y = event.getY(); if (v == mScrollView) { switch (action) { case MotionEvent.ACTION_DOWN: /* * L'utilisateur vient d'appuyer sur la vue. Si l'appui * s'effectue sur le fichier et que la poubelles est vide on * peut démarrer le "dragging" en initialisant les variables * utiles par la suite */ Toast.makeText(Article.this, "appui sur la vue",Toast.LENGTH_SHORT).show(); /* * On retourne true afin que l'ensemble des évènements * suivants nous parviennent */ return true; case MotionEvent.ACTION_MOVE: /* * L'utilisateur est en train de bouger son doigt sur l'écran. * On effectue simplement le déplacement de l'image du fichier * texte à la position du doigt */ Toast.makeText(Article.this, "bouge le doigt",Toast.LENGTH_SHORT).show(); /* * On invalide la vue afin de dessiner l'image du fichier au * nouvel endroit. La méthode appellée est expliquée plus bas. */ return true; case MotionEvent.ACTION_UP: /* * L'utilisateur vient de relacher la pression sur l'écran. */ Toast.makeText(Article.this, "relache la pression",Toast.LENGTH_SHORT).show(); return true; } return super.onTouchEvent(event); } return false; } Merci à tous, d'avoir pris de votre temps, mais finalement, je vais abandonner l'idée d'écouter un click sur mon FrameLayout. :| Je vous aie (ou ais) trouvé tous très patient.. Merci beaucoup :| :| Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.