2013-03-26 2 views
1

Je dois gérer uniquement les événements de clic long de TextView (et afficher le menu contextuel de cet événement). Mais dans le cas d'un simple clic, je devrais transférer cet événement à la disposition hébergeant cette vue.Comment ne pas gérer View.onClick() et gérer View.onLongClick() dans le même temps?

Comment y parvenir? De cette manière, nous allons recevoir deux événements de clic séquentiels et il y aura deux sons de clic standard dans android. Pas bon.

Existe-t-il une façon simple d'y parvenir?

Voici le xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mTopLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <TextView 
     android:id="@+id/mTextView" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     android:background="#FFFF0000" 
     android:clickable="false" 
     android:focusable="false" 
     android:text="@string/hello_world" /> 

</RelativeLayout> 

EDIT: Juste pour ajouter des détails. Si je ne vais pas mettre onClickListener alors clcking dans TextView est fait sans aucun effet et cet événement est consommé par mTextView (même si cliquable et focusable est défini sur false en xml) et pas transmis à mTopLayout

+0

peut être GestureDetecter aidera ici? – Prizoff

+0

Je fais quelque chose de similaire ICI !!! http://stackoverflow.com/questions/16621070/get-context-of-popupmenu-like-contextmenu – toobsco42

Répondre

0

Enfin ...

Pourquoi à tout ce que je besoin de faire ce onClickListeners utiliser des gestionnaires différents? Stupide.

@Override 
public void onClick(View v) { 
    Toast.makeText(this, v.getClass().getName() + " clicked!", Toast.LENGTH_SHORT).show(); 
    if (v.getId() == R.id.mTextView || v.getId() == R.id.mTopLayout) { 
     //do whatever I need 
    } 
} 

Très simple.

1

Je ne suis pas clair avec ce que vous vouloir faire avec le clic seulement, mais Android ne capte qu'un seul clic liste à la fois soit onClick ou onLongClick.

+0

Cliquez uniquement pour passer en arrière-plan et effectuer d'autres actions, non liées à TextView. Donc, les simples clics devraient se comporter de cette façon, car il n'y a pas du tout ce TextView, et seuls les longs clics devraient ouvrir le menu contextuel pour copier son contenu dans le Presse-papiers - c'est un arrière-plan de tout cela. – Prizoff

+0

Et juste vérifié, Android répond à la fois 'onClick()' ET 'onLongClick()' sur le même 'View'. – Prizoff

1

Ajouter auditeurs séparés ..

mTextView.setOnLongClickListener(new OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      // do something; 
     } 
    }); 

mTextView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // do something 

     } 
    }); 
+0

Dans ce cas, Android considérera onClickEvent dans onClickListener de mTextView comme étant traité et émettra un son de clic - ce qui est mauvais. – Prizoff

0

Je viens de créer un projet de démonstration. même question OnLongClick il a été la mise à feu Surclic aussi mais quand je l'ai changé la valeur de retour de setOnLongClickListener à false il a commencé à gérer ces clics individuellement.

mbuttton = (Button)findViewById(R.id.View1); 

     mbuttton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getBaseContext(), "single click", Toast.LENGTH_LONG).show(); 
       Log.i("Single Click", "Single click"); 
      } 
     }); 

     mbuttton.setOnLongClickListener(new OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
       // TODO Auto-generated method stub    
       Toast.makeText(getBaseContext(), "LONG click", Toast.LENGTH_LONG).show(); 
       Log.i("Long Click", "Long click"); 
       return true; 
      } 
     }); 

je l'ai fait arriver, mais si vous demandez des explications oooohhh je suis presque abandonner alors, ne sais pas comment ces valeurs de retour sont gérées

+0

onLongClickListener renvoie true. Le problème est en bref Lien :) Comment dire à Android, que je n'en ai pas besoin du tout? :) – Prizoff

+0

ce que cela va donner? onLongClickListener() n'est pas invoqué du tout lors de courts clics. – Prizoff

+0

Je l'ai fait arriver mais si vous demandez des explications oooohhh je suis presque abandonner alors, ne sais pas comment ces valeurs de retour sont gérées .. renvoyant false pour que cela se produise mis à jour ma réponse (contient mon application de démo créée pour la vérifier) – DeltaCap

Questions connexes