PopupWindow – 在外部点击时closures

我有一个PopupWindow对我的活动,事情是我的PopupWindow仍然显示,即使当我与我的活动进行交互(例如滚动我的列表)。 我可以滚动我的列表,PopupWindow仍然在那里。

我想要实现的是当我在不是PopupWindow的屏幕上触摸/滚动/点击/等时,我想closuresPopupWindow。 就像菜单是如何工作的 如果您在菜单外单击,菜单将被解除。

我已经尝试setOutsideTouchable(true)但它不会消除窗口。 谢谢。

请尝试在PopupWindow上设置setBackgroundDrawable ,如果您在其外面触摸,应该closures该窗口。

我发现没有任何提供的答案为我工作,除了WareNinja对接受的答案的评论,并且Marcin S.'s也可能工作。 以下是适合我的部分:

 myPopupWindow.setBackgroundDrawable(new BitmapDrawable()); myPopupWindow.setOutsideTouchable(true); 

或者:

 myPopupWindow.setFocusable(true); 

不知道有什么区别,但是ListPopupWindow源代码实际上在使用setModal将模态设置为true时使用后者,所以至lessAndroid开发者认为这是一种可行的方法,而且只有一行。

我遇到了同样的问题,并将其固定为以下代码。 它对我来说工作正常。

  // Closes the popup window when touch outside. mPopupWindow.setOutsideTouchable(true); mPopupWindow.setFocusable(true); // Removes default background. mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 

顺便说一句,不要使用BitmapDrawable不赞成使用的构造函数,使用这个新的ColorDrawable(android.R.color.transparent)来replace默认的背景。

玩的开心@。@

我知道这是晚了,但我注意到,人们仍然有popup窗口的问题。 我已经决定写一个完整的工作例子,在这里你可以通过触摸或点击popup窗口或者只是触摸窗口来解除popup窗口。 为此,请创build一个新的PopupWindow类并复制此代码:

PopupWindow.class

 public class PopupWindow extends android.widget.PopupWindow { Context ctx; Button btnDismiss; TextView lblText; View popupView; public PopupWindow(Context context) { super(context); ctx = context; popupView = LayoutInflater.from(context).inflate(R.layout.popup, null); setContentView(popupView); btnDismiss = (Button)popupView.findViewById(R.id.btn_dismiss); lblText = (TextView)popupView.findViewById(R.id.text); setHeight(WindowManager.LayoutParams.WRAP_CONTENT); setWidth(WindowManager.LayoutParams.WRAP_CONTENT); // Closes the popup window when touch outside of it - when looses focus setOutsideTouchable(true); setFocusable(true); // Removes default black background setBackgroundDrawable(new BitmapDrawable()); btnDismiss.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { dismiss(); }}); // Closes the popup window when touch it /* this.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_MOVE) { dismiss(); } return true; } }); */ } // End constructor // Attaches the view to its parent anchor-view at position x and y public void show(View anchor, int x, int y) { showAtLocation(anchor, Gravity.CENTER, x, y); } } 

现在创buildpopup窗口的布局: popup.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="1dp" android:orientation="vertical" android:padding="10dp" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:padding="5dp" android:text="PopupWindow Example" android:textColor="#000000" android:textSize="17sp" android:textStyle="italic" /> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical"> <Button android:id="@+id/btn_dismiss" style="?android:attr/buttonStyleSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Dismiss" android:visibility="gone" /> <TextView android:id="@+id/lbl_dismiss" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Touch outside of this box to dismiss" android:textColor="#ffffff" android:textStyle="bold" /> </FrameLayout> 

在你的主要活动中创build一个PopupWindow类的实例:

 final PopupWindow popupWindow = new PopupWindow(this); popupWindow.show(findViewById(R.id.YOUR_MAIN_LAYOUT), 0, -250); 

其中YOUR_MAIN_LAYOUT是popup窗口将popup的当前活动的布局

对于ListPopupWindow将窗口设置为显示模式。

 mListPopupWindow.setModal(true); 

这样,在ListPopupWindow之外单击将消除它。

将窗口背景设置为透明:

 PopupWindow.getBackground().setAlpha(0); 

在布局中设置背景之后。 工作正常。

请注意,对于用popupWindow.setOutsideTouchable(true)取消,您需要使宽度和高度wrap_content像下面的代码一样:

 PopupWindow popupWindow = new PopupWindow( G.layoutInflater.inflate(R.layout.lay_dialog_support, null, false), WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, true); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); popupWindow.showAtLocation(view, Gravity.RIGHT, 0, 0); 
 mPopWindow.setFocusable(true); 

@LunaKongbuild议工作就像一个魅力。

但是设置mPopupWindow.setFocusable(false)。 删除使popup窗口消失所需的不必要的触摸。

例如:让我们考虑一下在屏幕上可以看到一个popup式窗口,然后您即将点击一个button。 所以在这种情况下,(如果mpopwindow.setFocusable(true))buttonpopupwindow的第一次点击将消除。 但是你必须再次点击才能使button有效。 如果**(mpopwindwo.setFocusable(false)**单击buttonclosurespopup窗口以及触发button单击。希望它有帮助。

  popupWindow.setTouchable(true); popupWindow.setFocusable(true); popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0); 

当点击/触摸屏幕时,它将closuresPopupWindow。确保你已经在showAtLocation之前设置了focusable true。

在某些情况下,使popup式对焦是不可取的(例如,您可能不希望它从另一个angular度窃取焦点)。

另一种方法是使用触摸式拦截器:

 popupWindow.setOutsideTouchable(true); popupWindow.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { popupWindow.dismiss(); } return false; } }); 

感谢@ LunaKong的回答和@ HourGlass的确认。 我不想做一个重复的评论,但只想说清楚和简洁。

 // Closes the popup window when touch outside. This method was written informatively in Google's docs. mPopupWindow.setOutsideTouchable(true); // Set focus true to make prevent touch event to below view (main layout), which works like a dialog with 'cancel' property => Try it! And you will know what I mean. mPopupWindow.setFocusable(true); // Removes default background. mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 

Mttdat。