2012-09-11 133 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

請隨時向您的代碼添加解釋。 –