Android Klicken Sie sich durch PopupWindow
Ich habe eine Klasse erstellt, die das Popup-Fenster erweitert. Der Konstruktor sieht ungefähr so aus
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);
Der onTouchListener sieht folgendermaßen aus:
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;
}
};
Um das Popup-Fenster tatsächlich anzuzeigen, rufe ich anSomePopupWindow.showAtLocation(SomeActivity.getWindow().getDecorView().getRootView(), Gravity.CENTER, 0, 0);
Visuell dargestellt ist hier das betreffende Produkt
Der touchListener antwortet, aber die Eingabe wird nicht an die zugrunde liegende Aktivität gesendet ODER an das Popup-Fenster? (Der Knopf reagiert nicht, als würde ich den Ontouchlistener entfernen, der Knopf funktioniert einwandfrei).
aktualisieren Wenn ich den Touch-Listener auf FrameLayout (d. h. die Inhaltsansicht des Popup-Fensters in diesem Fall) anstelle des Popup-Fensters selbst setze, kann ich auf die im Popup definierten Schaltflächen klicken. Ich suche noch nach einer Möglichkeit, das Berührungsereignis an die zugrunde liegende Aktivität / Ansicht zu delegieren
LÖSUNG
Registrieren Sie einen Touch Interceptor für das Popup-Fenster. Wenn Sie möchten, dass die Aktivität sie verarbeitet, und davon ausgeht, dass Sie einen Verweis auf die Aktivität haben, rufen Sie ansomeActivity.dispatchTouchEvent(someMotionEventPassedIntoTheTouchIntercepter);
Rufen Sie an, wenn das Popup-Fenster die Berührung selbst verarbeiten sollsomeView.dispatchTouchEvent(theMotionEventPassedToTouchInterceptor)
zum Popup-FensterInhaltsansicht, wie in den Popupfenstern eingestelltsetContentView(someView)
Methode.
Meine Methode sah speziell wie folgt aus
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;
}
};