Aller au contenu

Récupérer un click d'une FrameLayout


vince123

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

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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 :)

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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");
}

Lien vers le commentaire
Partager sur d’autres 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 ?! :/

Lien vers le commentaire
Partager sur d’autres 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)

Lien vers le commentaire
Partager sur d’autres 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);
   }

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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 :| :|

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...