2012-04-14 15 views
5

Tengo una vista de galería personalizada para el desplazamiento horizontal y varias vistas secundarias en las que se debe poder hacer clic.Android: View.setClickable consume el evento click

La configuración childview.setOnClickListener() no funciona, ya que siempre consume el evento táctil.

Por lo tanto, utilicé childview.setOnTouchListener() y dejé que su método onTouch devuelva false, de modo que la Galería se puede desplazar.

Esto está todo bien.

El problema ahora es que el método onTouch de childView solo activa el evento ACTION_DOWN. No pasa el MotionEvent ACTION_UP a menos que haga clic en la vista configurando childview.setClickable(). Sin embargo, la configuración de la vista en la que se puede hacer clic parece consumir el evento onTouch para que la vista de la galería no se pueda deslizar.

Parece que voy en un círculo aquí. Estaría agradecido por cualquier ayuda.

Aquí está mi código

Ver galería:

public class myGallery extends Gallery { 

    public myGallery(Context ctx, AttributeSet attrSet) { 
     super(ctx, attrSet); 
     // TODO Auto-generated constructor stub 
    } 

    private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){ 
      return e2.getX() > e1.getX(); 
     } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY){ 
     int kEvent; 
     if(isScrollingLeft(e1, e2)){ //Check if scrolling left 
     kEvent = KeyEvent.KEYCODE_DPAD_LEFT; 
     }else{ //Otherwise scrolling right 
     kEvent = KeyEvent.KEYCODE_DPAD_RIGHT; 
     } 
     onKeyDown(kEvent, null); 
     return true; 
    } 
} 

en mi Actividad:

gallery.setOnItemSelectedListener(new OnItemSelectedListener(){ 
    public void onItemSelected(AdapterView<?> parent, View view, 
        int position, long id) { 


     // childView.setClickable(true); // can't use this 
              // click event would get consumed 
              // and gallery would not scroll 

     // therefore, I can only use the ACTION_DOWN event below: 

     childView.setOnTouchListener(new OnTouchListener() { 
       public boolean onTouch(View v, MotionEvent event) { 

       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         //doStuff(); 
       } 

       return false; 
       } 
     }); 
    } 

    public void onNothingSelected(AdapterView<?> arg0) {} 
    }); 
} 
+0

obtuviste la respuesta en la segunda mitad. – Prateek

Respuesta

2

Si yo fuera usted, me gustaría tratar de anular ViewGroup.onInterceptTouchEvent(...) método en lugar de establecer OnTouchListener. De esta forma, debería poder interceptar eventos táctiles sin consumirlos.

Check out javadoc.

0

OnTouch tiene que devolver true para indicar que desea que el resto de los acontecimientos. Aquí hay un ejemplo:

• onTouch() - Esto devuelve un booleano para indicar si su oyente consume este evento. Lo importante es que este evento puede tener múltiples acciones que se suceden. Por lo tanto, si devuelve falso cuando se recibe el evento de acción inactiva, indica que no ha consumido el evento y que tampoco está interesado en las acciones posteriores de este evento. Por lo tanto, no se te pedirá ninguna otra acción dentro del evento, como un gesto con el dedo o el evento eventual de acción ascendente.

From the android dev guid

+0

gracias, lo entiendo. El problema es que si configuro onTouch() para que sea verdadero, el evento táctil se consumirá y la vista principal (la Galería) ya no recibirá el evento, es decir, la galería se volverá inservible. –

+0

Echa un vistazo a la segunda mitad de esta sección. Creo que encontrará lo que necesita: [http://developer.android.com/guide/topics/ui/ui-events.html#EventHandlers] – cstrutton

+0

Traté de encontrar la respuesta en la segunda mitad pero no pude, ¿verdad? tener alguna solución rápida. – Prateek

Cuestiones relacionadas