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。