如何在Android中关闭弹出窗口?

4
我有一个弹出窗口,当活动中的按钮被点击时会弹出。对话框覆盖整个屏幕,只包含三个按钮。如果单击按钮,则它们会相应地工作。但是,如果用户在弹出窗口中除按钮以外的任何地方触摸,则希望弹出窗口消失。我尝试了以下代码。
popupWindow.setOutsideTouchable(true);
popupWindow.showAtLocation(layout, Gravity.FILL, 0, 0);

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

但是它没有起作用。我也设置了这个:
popupWindow.setFocusable(true);

popupWindow.setTouchable(true);

我的弹出窗口布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/popup_element"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#80000000"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="10px">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="16dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:padding="10dp">

        <ImageButton
            android:id="@+id/voiceCall"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_gravity="center|center_horizontal"
            android:background="@drawable/round_button"
            android:padding="15dp"
            android:scaleType="fitCenter"
            android:src="@drawable/ic_call_black_24dp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Voice Call"
            android:textColor="#ffffff"
            android:textSize="20dp" />
    </LinearLayout>
</LinearLayout>

enter image description here

如果我在这个弹出窗口除了那两个按钮之外的任何地方点击,我希望它被关闭。 对我来说无效。有人可以建议我如何做到这一点吗?此外,如果点击设备的返回按钮,我希望弹出窗口消失。

请分享您的布局文件。 - Jay Patel
7个回答

5
您可以为包含这两个按钮的LinearLayout编写setOnClick监听器。像这样...
linearlayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        });

2
这里是答案 - 只需按照下面的方式编写:
popupWindow.setOutsideTouchable(true);
popupWindow.setCancelable(true);

它会正常工作!如果答案有帮助,请投票。


1
你的意思是:
popupWindow.setCancelable(true);

或者

popupWindow.setCanceledOnTouchOutside(true);

取决于构建器级别或对话框级别。
@update2:
// set a listener to listen your popup window click event
popupWindow.getContentView().setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        popupWindow.dismiss();
    }
});

如果点击返回按钮,请检查它是否正在显示:
@Override
public void onBackPressed() {
    if(popupWindow.isShowing()) {
        popupWindow.dismiss();
        return;
    }
    super.onBackPressed();
}

由于我正在使用PopupWindow对象,因此没有这样的方法。 - sangeeta
抱歉,请稍等。 - Alan

0
只需要使用 popupWindow.dismiss();,为什么要用 setTouchInterceptor 和其他的操作呢?

1
我不明白何时使用dismiss()函数。 - sangeeta
1
如何在弹出窗口中捕获除按钮以外的任何事件? - sangeeta
voiceCall.setonclickelistner...(){ popupWindow.dismiss();}这样的代码 - Chirag.T
你肯定在弹出窗口中放大了某些布局。 - Chirag.T

0
如果popupWindow是AlertDialog的对象,您可以使用以下方法:
dialog.setCanceledOnTouchOutside(true);

它是PopupWindow的一个对象。 - sangeeta

0

在弹出窗口所在的活动中尝试此代码片段:

@Override
    public void onBackPressed() {
        super.onBackPressed();
        popupWindow.setOutsideTouchable(true); 
        popupWindow.dismiss();

}

0
首先,将您的布局宽度和高度设置为wrap_content,以便您可以查看剩余的屏幕。 然后,您可以将setCancelable()属性设置为true,如下所示: popupWindow.setCancelable(true);
或者您可以在onBackPress()方法中使用popupWindow.dismiss(),该方法需要被覆盖,例如:
@Override
public void onBackPressed() {
    super.onBackPressed();
    popupWindow.dismiss();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接