我有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();
}
});
答案 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 方法
中创建 alertDialogBuilder 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 方法中调用此函数。
应在 alertDialogBuilder 创建语句之后调用。之后,在您的按钮 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()
来管理您的活动对话框。那样可以解决你的问题。
回调创建活动管理(保存和恢复)的对话框。默认实现调用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();
}
}
});