Android Click Through PopupWindow

Я создал класс, который расширяет popupwindow. Его конструктор выглядит примерно так:

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 выглядит следующим образом:

 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; } }; 

Для фактического отображения popupwindow я вызываю SomePopupWindow.showAtLocation(SomeActivity.getWindow().getDecorView().getRootView(), Gravity.CENTER, 0, 0);

Визуально представленный, вот этот продукт

вздор

TouchListener отвечает, но вход не отправляется в базовый актив или всплывающее окно? (Кнопка не отвечает, где, как если бы я удалял ontouchlistener, кнопка отлично работает).

Обновление настройки сенсорного прослушивателя в frameLayout (т. Е. Представление содержимого popupwindow в этом случае) вместо самого popupwindow позволяет мне щелкнуть по кнопкам, определенным во всплывающем окне. Все еще ищут способ делегирования события касания к основному виду деятельности / представлению

РЕШЕНИЕ

Зарегистрируйте сенсорный перехватчик для Popupwindow. Если вы хотите, чтобы активность обрабатывала его, предполагая, что у вас есть ссылка на активность, вызовите someActivity.dispatchTouchEvent(someMotionEventPassedIntoTheTouchIntercepter); , Если вы хотите, чтобы popupwindow обрабатывал сенсорное соединение, вызовите someView.dispatchTouchEvent(theMotionEventPassedToTouchInterceptor) в представление содержимого popupwindow, как установлено в методе setContentView(someView) .

Мой метод был определен следующим образом:

 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; } }; 

РЕШЕНИЕ

Зарегистрируйте сенсорный перехватчик для Popupwindow. Если вы хотите, чтобы активность обрабатывала его, предполагая, что у вас есть ссылка на активность, вызовите someActivity.dispatchTouchEvent(someMotionEventPassedIntoTheTouchIntercepter); , Если вы хотите, чтобы popupwindow обрабатывал сенсорное соединение, вызовите someView.dispatchTouchEvent(theMotionEventPassedToTouchInterceptor) в представление содержимого popupwindow, как установлено в методе setContentView(someView) .

Мой метод был определен следующим образом:

 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; } }; 
 public class TestPopupActivity extends Activity { //The "x" and "y" position of the "Show Button" on screen. Point p; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn_show = (Button) findViewById(R.id.show_popup); btn_show.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //Open popup window if (p != null) showPopup(TestPopupActivity.this, p); } }); } // Get the x and y position after the button is draw on screen // (It's important to note that we can't get the position in the onCreate(), // because at that stage most probably the view isn't drawn yet, so it will return (0, 0)) @Override public void onWindowFocusChanged(boolean hasFocus) { int[] location = new int[2]; Button button = (Button) findViewById(R.id.show_popup); // Get the x, y location and store it in the location[] array // location[0] = x, location[1] = y. button.getLocationOnScreen(location); //Initialize the Point with x, and y positions p = new Point(); px = location[0]; py = location[1]; } // The method that displays the popup. private void showPopup(final Activity context, Point p) { int popupWidth = 200; int popupHeight = 150; // Inflate the popup_layout.xml LinearLayout viewGroup = (LinearLayout) context.findViewById(R.id.popup); LayoutInflater layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = layoutInflater.inflate(R.layout.popup_layout, viewGroup); // Creating the PopupWindow final PopupWindow popup = new PopupWindow(context); popup.setContentView(layout); popup.setWidth(popupWidth); popup.setHeight(popupHeight); popup.setFocusable(true); // Some offset to align the popup a bit to the right, and a bit down, relative to button's position. int OFFSET_X = 30; int OFFSET_Y = 30; // Clear the default translucent background popup.setBackgroundDrawable(new BitmapDrawable()); // Displaying the popup at the specified location, + offsets. popup.showAtLocation(layout, Gravity.NO_GRAVITY, px + OFFSET_X, py + OFFSET_Y); // Getting a reference to Close button, and close the popup when clicked. Button close = (Button) layout.findViewById(R.id.close); close.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { popup.dismiss(); } }); } } 

Попробуйте этот код, возможно, он вам поможет. , Или может быть эта ссылка поможет вам больше .. http://mrbool.com/how-to-implement-popup-window-in-android/28285