快速单击按钮,对话框打开两次

时间:2012-09-11 12:43:02

标签: android button android-alertdialog

我有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();
    }
});

10 个答案:

答案 0 :(得分:9)

您只需检查您的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(); 
        }
    }
});

答案 1 :(得分:7)

全球宣布:

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()

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

答案 2 :(得分:1)

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

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

MyDialog dialog = MyDialog.newInstance();
dialog.show(ft, "dialog");

答案 3 :(得分: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();
   }

就是这样。它解决了我的问题。希望它也能解决您的问题。

答案 4 :(得分:0)

单击按钮后禁用该按钮,取消对话框后再次启用按钮。如下所示

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

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

答案 5 :(得分:0)

调用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;
    }
}

答案 6 :(得分:0)

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

 private long mLastClickTime = 0;

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

    if(isSingleClick){
    openDialog();
    }

答案 7 :(得分:-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);
}

}

答案 8 :(得分:-1)

试试这个。

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

  private MediaPlayerDialog dialog;

第2步。现在将代码放在你的btton点击下面。

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

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

最好的运气

答案 9 :(得分:-2)

尝试这样......

Dialog passwordDialog = new Dialog(SettingsActivity.this);


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