13

我有Button,单击时会显示Dialog. 一切都像一个魅力,但如果我双击按钮或快速单击按钮,Dialog打开两三下。我必须单击后退按钮两次或三次才能关闭Dialog.

我已经搜索了有关SO的相关问题,但大多数答案都建议禁用按钮或使用变量并将其设置为 true 和 false,这不是我的要求。

如果有人知道如何解决这个问题,请帮助我。

我用过的代码

// Delete item on click of delete button
holder.butDelete.setOnClickListener(new OnClickListener() {         
@Override
    public void onClick(View v) {
        Dialog passwordDialog = new Dialog(SettingsActivity.this);      
        passwordDialog.show();
    }
});
4

10 回答 10

11

您只需检查您的Dialog是否已显示

Dialog passwordDialog = new Dialog(SettingsActivity.this);
holder.butDelete.setOnClickListener(new OnClickListener() {           
    @Override
    public void onClick(View v) {                  
        if(!passwordDialog.isShowing()) {
            passwordDialog.show();
        }
    }
});

更新:

如果这在您的情况下不起作用,那么在您的活动中全局声明

Dialog passwordDialog = null;

Button点击:

holder.butDelete.setOnClickListener(new OnClickListener() {           
    @Override
    public void onClick(View v) {                  
        if(passwordDialog == null) {
            passwordDialog = new Dialog(SettingsActivity.this); 
            passwordDialog.show(); 
        }
    }
});
于 2012-09-11T12:53:11.293 回答
9

全球宣布:

private Boolean dialogShownOnce = false;
private mDialog dia;

dialog.show();的名字在哪里:

dia = new mDialog(getContext());

if (!dia.isShowing() && !dialogShownOnce) {
    dia.show();
    dialogShownOnce = true;
}

dia.setOnDismissListener(new DialogInterface.OnDismissListener() {
    @Override
    public void onDismiss(DialogInterface dialog) {
        dialogShownOnce = false;
    }
});

mDialog 不必是全局的,但我调用mDialog.dismiss()了一些超出本地范围的接口。

仍然使用 a Boolean,但我不明白为什么不能使用它。

于 2015-10-19T10:10:00.800 回答
4

将此代码放在您要显示对话框的位置,它会根据其标签名称检查是否存在对话框。

FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prevFragment = getFragmentManager().findFragmentByTag("dialog");
if (prevFragment != null) {
    return;
}

MyDialog dialog = MyDialog.newInstance();
dialog.show(ft, "dialog");
于 2017-05-30T06:39:23.123 回答
1

我遇到了同样的问题。这就是我修复它的方式

private AlertDialog.Builder alertDialogBuilder;
private AlertDialog alertDialog;

全局声明上述变量

alertDialogBuilder = new AlertDialog.Builder(this);

然后像上面一样在OnCreate方法中创建alertDialogBu​​ilder

    private void AlertDialogMessage(){
        alertDialogBuilder.setMessage("Internet disconnected!");
        alertDialogBuilder.setCancelable(true);
        alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        alertDialog = alertDialogBuilder.create();
   }

我们刚刚在这个函数中烘焙了我们的警报对话框。在OnCreate方法中调用此函数。
它应该在alertDialogBu​​ilder创建语句之后调用。之后在您的按钮OnClickListener 中将其放在下面的代码中。

   if (!alertDialog.isShowing()){
        alertDialog.show();
   }

而已。它解决了我的问题。希望它也能解决您的问题。

于 2020-09-05T12:38:19.067 回答
1

调用该show()方法时需要一点时间才能isShowing()返回true
起初,它返回false,因为对话入口动画尚未完成。我的解决方案是构建对话框类的新实现。

public class ObedientDialog extends Dialog{

    private boolean showing;

    public ObedientDialog(Context context) {

        setOnCancelListener(new OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                showing=false;
            }});

        setOnDismissListener(new OnDismissListener() {
            @Override
            public void onDismiss(DialogInterface dialog) {
                showing=false;
            }});
    }

    @Override
    public void show() {
        if (!showing) super.show();
        showing=true;
    }

    public boolean isShowing(){
        return showing;
    }
}
于 2018-05-24T16:20:26.797 回答
0

单击按钮后禁用该按钮,并在取消对话框后再次启用该按钮。像下面

 holder.butDelete.setOnClickListener(new OnClickListener()
            {           
                @Override
                public void onClick(View v)
                {   
                    holder.butDelete.setEnabled(false);
                    Dialog passwordDialog = new Dialog(SettingsActivity.this);      
                    passwordDialog.show();
                }
            });

如果它不起作用,您必须获取一个布尔变量并使用它来显示和取消对话框。

于 2012-09-11T12:47:34.127 回答
0

您也可以使用下面给出的代码

 private long mLastClickTime = 0;

public boolean isSingleClick() {
            if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
                return false;
            }
            mLastClickTime = SystemClock.elapsedRealtime();
            return true;
        }

    if(isSingleClick){
    openDialog();
    }
于 2020-01-02T09:59:49.473 回答
-1

您可能应该通过覆盖onCreateDialog()方法然后调用showDialog(). 那会解决你的问题。

http://developer.android.com/reference/android/app/Activity.html#onCreateDialog(int, android.os.Bundle)

用于创建由活动为您管理(保存和恢复)的对话框的回调。默认实现调用 onCreateDialog(int) 以实现兼容性。如果您的目标是 HONEYCOMB 或更高版本,请考虑改用 DialogFragment。

例子:

public class TestActivity extends Activity {

private static final int TEST_DIALOG_ID = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    showDialog(TEST_DIALOG_ID);
}

@Override
protected Dialog onCreateDialog(int id) {
    if(id == TEST_DIALOG_ID) {
        Dialog passwordDialog = new Dialog(this);      
        return passwordDialog;
    }
    return super.onCreateDialog(id);
}

}
于 2012-09-11T12:50:21.267 回答
-1

尝试这个。

步骤 1.将对话框对象声明为实例变量或全局变量

  private MediaPlayerDialog dialog;

第 2 步。现在将下面的代码放入您的按钮单击中。

 if (dialog == null || (!dialog.isVisible())) {
        dialog = new MediaPlayerDialog();
        dialog.setData(songListDatas, selectPosition);
        dialog.show(getSupportFragmentManager(), dialog.getClass().getName().toString());
    }

注意: MediaPlayer是我的自定义DialogFragment,您可以根据您的要求进行更改。

祝你好运

于 2016-05-06T09:46:57.197 回答
-2

试试这样...

Dialog passwordDialog = new Dialog(SettingsActivity.this);


holder.butDelete.setOnClickListener(new OnClickListener()
{           
            @Override
            public void onClick(View v)
            {                         
                if(!passwordDialog.isShowing()) {   
                   passwordDialog.show();
                }
            }
});
于 2012-09-11T12:54:43.793 回答