2012-09-11 81 views
10

我有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

如何使'onClick()'内部的代码同步,并检查对话框是否已经打开。 –

+0

看看我更新的答案.. – user370305

+1

Dayuuuum!你的速度比处理器的速度还快;) – waqaslam

回答

10

你必须只检查是否您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(); 
     } 
    } 
}); 
+0

我用这个...它的工作原理,但有时快速点击它显示对话框两次......这就是为什么我发布的问题。 – Rahul

+0

但在我的Dialog passwordDialog是一个局部变量...因为我在一个地方只用,所以我不声明它全球 – Rahul

+0

好吧...我会尽量让你知道。 – Rahul

0

禁用按钮,一旦你点击它,一旦你取消对话框再次启用。像下面

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

,如果它不工作,你必须采取一个布尔变量,并用它来展示并取消对话框。

+0

我不认为你读了我的问题......我用大写字母写了这个。 – Rahul

+0

对不起,我没有看到。 – sankar

0

您应该可以让您的对话由您的活动管理,方法是重写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); 
} 

} 
+0

可以给我看一个例子........ – Rahul

+0

看我的编辑代码 – fiddler

+0

showDialog工作得很好,但它已被弃用。 –

-1

尝试像这样...

Dialog passwordDialog = new Dialog(SettingsActivity.this); 


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

这将永远不会工作,'passwordDialog.isShowing()'每次在新创建的实例上调用。 –

3

你真的应该使用FragmentManager展示dialogFragment。然后,它会很容易查询,如果fragmentManager知道一个特定的标记dialogFragment:

Fragment foundFragment = getFragmentManager().findFragmentByTag("myItemEditDialogFragment"); 
if (foundFragment == null) { 
    DialogFragment df = ItemEditDialogFragment.newInstance(o); 
    df.setTargetFragment(this, 0); 
    df.show(getFragmentManager().beginTransaction(), "myItemEditDialogFragment"); 
} 

这是DialogFramgnet静态newInstance方法是什么样子:

public static ItemEditDialogFragment newInstance(Item o) { 
    ItemEditDialogFragment df = new ItemEditDialogFragment(); 

    Bundle args = new Bundle(); 
    args.putParcelable(ARG_INSTANCE, o); 
    df.setArguments(args); 

    return df; 
} 
+1

不起作用,如果在没有时间的情况下调用两次,FragmentManager将不会知道对话框。 – Frank

6

全局声明:

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,但我不明白为什么它不能使用。

0

试试这个。

第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您可以根据您的要求进行更改。

祝您好运

1

的将这个代码中要显示的对话框,它会检查存在于它的标签名称对话的基础。

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

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

请随时向您的代码添加解释。 –