2010-09-30 10 views
21

tengo la siguiente jerarquía: Activity ->PopupWindow ->CustomViewAndroid: delegado de eventos táctil para ver subyacente

Mi la PopupWindow sí mismo es un cuadrado, pero transparente, por lo que se puede ver la Actividad sentado en el fondo. El CustomView es un círculo incrustado dentro de la ventana emergente. alt text

lo que he conseguido hasta ahora es

  1. usuario hace clic en el círculo verde y invoco "algunas cosas"
  2. usuario hace clic fuera de la PopupWindow y el evento táctil Se envía a la actividad.

La parte que falta es ahora, para despachar cualquier caso táctil que sucede dentro de la PopupWindow pero fuera de la CustomView (círculo) a la actividad.

Ya sé cómo sentir cuando el toque está fuera de mi círculo. Solo tengo problemas para delegarlo en la Actividad.

En mi CustomView Tengo el siguiente en onTouch

if (radiusTouch > maxRadius) { 
    return false; 
} 

En mi Ya configuración PopupWindow la siguiente, pero nunca se llama a:

popup.setTouchInterceptor(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     Log.i(TAG, "PopupWindow :: onTouch()"); 
     return false; 
    } 
}); 

Cualquier otra cosa que tengo que hacer para delegar el evento táctil hasta la actividad?

+3

¿cómo se crea que la maqueta?es bastante astuto – browep

+1

¿Cómo se las arregló para enviar los eventos de clic a las vistas debajo de PopUpWindow? – Mannaz

+1

Las maquetas balsámicas se han realizado mediante las maquetas balsámicas http://balsamiq.com/products/mockups/ –

Respuesta

0

Es una lástima que PopupWindow no sea una subclase de ViewGroup o incluso de View. Entonces podría anular dispatchTouchEvent. ¿Puede modificar su vista personalizada para saber acerca de PopupWindow y llamar a dismiss() cuando hay un clic fuera del círculo?

12

Considere el FLAG_NOT_TOUCH_MODAL:

/** Window flag: Even when this window is focusable (its 
    * {@link #FLAG_NOT_FOCUSABLE is not set), allow any pointer events 
    * outside of the window to be sent to the windows behind it. Otherwise 
    * it will consume all pointer events itself, regardless of whether they 
    * are inside of the window. */ 
public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020; 

Usted puede utilizar este código para upate las banderas de la ventana después de se muestra la ventana emergente.

FrameLayout popupContainer = (FrameLayout)contentView.getParent(); 
WindowManager.LayoutParams p = (WindowManager.LayoutParams)popupContainer.getLayoutParams(); 
p.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 
WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE); 
windowManager.updateViewLayout(popupContainer, p); 
+0

Ok. Funciona. Puedo tocar ambas vistas dentro de 'popupWindow' y las vistas de la actividad. Solo 'updateViewLayout (contentView, p)', no 'contentView.getParent()' – Yeung

3

establecimiento de éstos en su instancia PopupWindow Probar:

window.setBackgroundDrawable(new BitmapDrawable());

window.setOutsideTouchable(true);

y

window.setTouchable(true);

Esta es sólo una sugerencia ... tengo no probado. Avísame si funciona.

[Nota: Esto es para el onTouch() para obtener pidió a los eventos de toque ..]

Cuestiones relacionadas