Haga clic en Android a través de PopupWindow
He creado una clase que extiende la ventana emergente. su constructor se parece a lo siguiente
super(builder.context.get());
this.setWindowLayoutMode(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT);
setFocusable(true);
setBackgroundDrawable(new BitmapDrawable());
setTouchInterceptor(onTouchListener);
FrameLayout frameLayout = new FrameLayout(builder.context.get());
LayoutInflater inflater = (LayoutInflater) builder.context.get().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
View overlayBase = inflater.inflate(R.layout.tutorial_view_items, null, false);
frameLayout.addView(builder.backgroundView);
frameLayout.addView(overlayBase);
setContentView(frameLayout);
onTouchListener tiene el siguiente aspecto:
private OnTouchListener onTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
Log.d(TAG, "Received");
if (Math.pow(x - coordinates[0], 2) + Math.pow((y - coordinates[1]), 2) < Math.pow(radius, 2)) {
Log.d(TAG, "bubbled through");
return false;
}
return true;
}
};
para mostrar realmente la ventana emergente, llamoSomePopupWindow.showAtLocation(SomeActivity.getWindow().getDecorView().getRootView(), Gravity.CENTER, 0, 0);
Representado visualmente, aquí está el producto en cuestión
TouchListener responde, pero la entrada no se envía a la actividad subyacente O a la ventana emergente? (el botón no responde, donde, como si fuera a quitar el ontouchlistener, el botón funciona bien).
actualizar configurar el oyente táctil en frameLayout (es decir, la vista de contenido de la ventana emergente en este caso) en lugar de la ventana emergente en sí misma me permite hacer clic en los botones definidos en la ventana emergente. sigo buscando la manera de delegar el evento táctil a la actividad / vista subyacente
SOLUCIÓN
Registre un interceptor táctil para la ventana emergente. Si desea que la actividad lo maneje, suponiendo que tiene una referencia a la actividad, llame alsomeActivity.dispatchTouchEvent(someMotionEventPassedIntoTheTouchIntercepter);
, si desea que la ventana emergente maneje el toque incluso, llamesomeView.dispatchTouchEvent(theMotionEventPassedToTouchInterceptor)
a la ventana emergentevista de contenido, como se establece en las ventanas emergentessetContentView(someView)
método.
Mi método se parecía específicamente al siguiente
private OnTouchListener onTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
if (Math.pow(x - coordinates[0], 2) + Math.pow((y - coordinates[1]), 2) < Math.pow(
radius, 2)) {
activity.get().dispatchTouchEvent(event);
return false;
}
frameLayout.dispatchTouchEvent(event);
return true;
}
};