在对话框“ setCanceledOnTouchOutside()”中,无法取消该框

时间:2018-08-07 12:18:39

标签: android dialog

好的,所以我做了一个对话:

package com.dharamshi.practice;

import android.app.Activity;
import android.app.Dialog;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;

public class ViewDialog {

    public void showDialog(Activity activity, String msg){
        final Dialog dialog = new Dialog(activity);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);
        dialog.setCancelable(false);
        dialog.setContentView(R.layout.dialog);

        TextView text = (TextView) dialog.findViewById(R.id.text_dialog);
        text.setText(msg);

        Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog);
        dialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();

    }
}

我希望对话框在单击对话框外的区域时自行关闭。

我还添加了setCanceledOnTouchOutside(true),但它无法正常工作。

我应该进行哪些更改才能使其正常工作?

我这样称呼它:

ViewDialog alert = new ViewDialog();
alert.showDialog(this, "Its Working!");

4 个答案:

答案 0 :(得分:1)

  

我还添加了setCanceledOnTouchOutside(true),但是它不起作用。

setCanceledOnTouchOutside()无法正常工作,因为您已向您的setCancelable(false)添加了 dialog 属性,这意味着当您单击时dialog不会消失dialog外部或按返回按钮

解决方案

您需要从dialog.setCancelable(false);方法中删除 showDialog()

setCancelable()

  

设置dialog是否可取消默认为true

示例代码

public class ViewDialog {

    public void showDialog(Activity activity, String msg){
        final Dialog dialog = new Dialog(activity);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);

        dialog.setContentView(R.layout.dialog);

        TextView text = (TextView) dialog.findViewById(R.id.text_dialog);
        text.setText(msg);

        Button dialogButton = (Button) dialog.findViewById(R.id.btn_dialog);
        dialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();

    }
}

答案 1 :(得分:1)

您犯了一个小而愚蠢的错误,

注释

dialog.setCancelable(false);

因为如果您希望在对话框区域之外单击时关闭对话框,那么将cancellable属性设置为false时,您希望如何关闭对话框。

更改它,它将起作用!

答案 2 :(得分:1)

dialog.setCancelable(false)不允许取消对话框。这就是为什么 dialog.setCanceledOnTouchOutside(true)没有显示任何效果的原因。

因此从代码中删除 dialog.setCancelable(false)

答案 3 :(得分:0)

如果您的对话框具有样式,只需添加此属性

<item name="android:windowIsFloating">true</item>

设置样式,如果没有样式,则将自定义样式应用于对话框,然后将此属性添加到对话框中。 例如:

<style name="DialogTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowBackground">@color/transparentDark</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowEnterAnimation">@anim/fade_in</item>
    <item name="android:windowExitAnimation">@anim/fade_out</item>

    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:statusBarColor">@color/statusBarColor</item>
</style>

然后像这样使用它:

对话框对话框=新对话框(活动,R.style.DialogTheme);         dialog.getWindow()。setWindowAnimations(R.style.DialogTheme);