Jump to content

Archived

This topic is now archived and is closed to further replies.

vince123

Récupérer un click d'une FrameLayout

Recommended Posts

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();
}

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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 :)

Share this post


Link to post
Share on other sites

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 :)

Share this post


Link to post
Share on other sites
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 :)

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

Share this post


Link to post
Share on other sites

si ton framelayout contient une scrollview, et uniquement cela, pourquoi ne pas plutôt écouter les clic sur celle ci ?

Share this post


Link to post
Share on other sites
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:

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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");
}

Share this post


Link to post
Share on other sites

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 ?! :/

Share this post


Link to post
Share on other sites

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)

Share this post


Link to post
Share on other sites
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)

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);
   }

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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 :| :|

Share this post


Link to post
Share on other sites





×
×
  • Create New...