PopupWindow - 辞退点击之外时(PopupWindow - Dismiss when

2019-06-17 23:41发布

我有我的活动PopupWindow,事情是我PopupWindow还表示,即使我与我的互动活动(比如滚动我的名单上)。 我可以通过我的列表中滚动和PopupWindow仍然存在。

我想实现的是,当我触摸/滚动/点击的/ etc这不是PopupWindow在屏幕上,我想解雇PopupWindow。 就像一个菜单是如何工作的。 如果你点击菜单之外,菜单将被解雇。

我试过setOutsideTouchable(true) ,但它不会关闭窗口。 谢谢。

Answer 1:

请尝试设置setBackgroundDrawablePopupWindow如果你触摸它的外面应该关闭该窗口。



Answer 2:

我发现,没有提供答案的工作对我来说,除了在接受的答案WareNinja的评论,马尔辛 - S.的可能也行。 下面是对我的作品的一部分:

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

或者:

myPopupWindow.setFocusable(true);

不知道的差异,但ListPopupWindow源代码,实际使用时,它的模式设置为与setModal真正后者,所以至少在Android开发认为这是一个可行的方法,而且只有一条线。



Answer 3:

我遇到了同样的问题,并修复它下面的代码。 这对我来说可以。

    // 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)取代默认背景。

玩得开心@。@



Answer 4:

我知道它的晚,但我注意到,人们仍然对弹出窗口的问题。 我决定写一个完全工作的例子,你可以辞退通过触摸或点击它的外部或刚刚接触窗口本身的弹出窗口。 这样做,创建一个新的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);
   }
}

现在您可以创建弹出窗口的布局: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>      

在您的主要活动创建PopupWindow类的实例:

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

其中YOUR_MAIN_LAYOUT是当前活动的布局,其中popupWindow会弹出



Answer 5:

感谢@ LunaKong答案,并@沙漏的确认。 我不想做重复的评论,而只是想让它简洁明了的。

// Closes the popup window when touch outside. This method was written informatively in Google's docs.
mPopupWindow.setOutsideTouchable(true);

// Set focus true to prevent a touch event to go to a 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。



Answer 6:

请注意,对于取消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);


Answer 7:

对于ListPopupWindow设置窗口所示,当是一个模态的。

mListPopupWindow.setModal(true);

这样一来,点击之外ListPopupWindow将其关闭。



Answer 8:

mPopWindow.setFocusable(true);


Answer 9:

设置窗口的背景透明:

PopupWindow.getBackground().setAlpha(0);

之后,它设置您的布局的背景。 工作良好。



Answer 10:

@LunaKong建议的工作就像一个魅力。

但是,建立mPopupWindow.setFocusable(假)。 去除,使弹出窗口消失所需不必要的触摸。

例如:让我们考虑有在屏幕上看到一个弹出窗口,你将要点击一个按钮。 所以在这种情况下,(如果mpopwindow.setFocusable(真))上的按钮popupwindow将解雇的第一次点击。 但是,你必须再次点击,使按钮的作品。 如果**(mpopwindwo.setFocusable(假)**按钮,只需点击一下关闭该弹出窗口以及触发按钮的点击。希望它能帮助。



Answer 11:

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

当screen.Make点击/触摸确认您已经showAtLocation之前设置可聚焦真正它将解雇PopupWindow。



Answer 12:

在某些情况下,使弹出可获得焦点是不可取的(例如,你可能不希望它从另一个视图偷焦点)。

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

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


Answer 13:

使用查看popupView驳回popupWindow

`popupView.setOnClickListener(new View.OnClickListener() {
                   @Override
                   public void onClick(View view) {
                       popupWindow.dismiss();
                   }
               }); 

`如果你使用这个,你也可以setOnClickListener任何按钮popupWindow内



文章来源: PopupWindow - Dismiss when clicked outside