2014-01-14 53 views
1

我有一個自定義首選項TimePreference,它延伸到DialogPreference。它有一個自定義對話框資源,它看起來像這樣關閉自定義首選項的對話框

Three buttons with their IDs

的源

@Override 
protected void onBindDialogView(View v){ 
    super.onBindDialogView(v); 

    v.findViewById(R.id.butCancel).setOnClickListener(onClickL); 
    v.findViewById(R.id.butNow).setOnClickListener(onClickL); 
    v.findViewById(R.id.butOK).setOnClickListener(onClickL); 
    //.... 
} 
//... 
private final View.OnClickListener onClickL = new View.OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
     Log.d(lTag, v + " clicked"); 
     switch (v.getId()) { 
      case R.id.butOK: saveToSP(false);break; 
      case R.id.butNow: saveToSP(true); 
     } 

     try { 
      getDialog().dismiss(); //may throw null pointer 
     } catch (Exception e) { Log.w(lTag, "Exc @onClickL", e); } 
    } 
}; 
//... 

我發現的地方,如果你點擊了相同的優先級非常快的一個錯誤兩次(在首選項屏幕上)會打開兩個對話框。您可以關閉第一個,但是當您嘗試關閉第二個時,應用程序會崩潰。這是一個NullPointerException,所以我把它放在一個try-catch塊中。現在,異常被捕獲,但按鈕不會關閉對話框。請注意,通過點擊返回,它確實與關閉。

如何關閉第二個對話框(可能通過模擬後退按鈕的行爲?)?請注意,我希望API級別低於10.

+0

這個對話框出現的原因是您的自定義或內置? – Saqib

+1

爲什麼不單擊時禁用按鈕,並在對話框關閉時將其啓用? –

+0

@Saqib內置的,我把它設置在.xml文件 – anestv

回答

0

好的,我找到了一個靈魂。我有一個靜態布爾值,它顯示是否有一個打開的對話框。

private static boolean isAnyDialogOpen = false; 

在對話框綁定,我把它設置爲true, 後,我關閉對話框,我將它設置爲false。 原來,即使這是有問題的,但解決的辦法是比較容易

@Override 
protected void onClick() { 
    if (isAnyDialogOpen) 
     Log.i(lTag, "there is a dialog already"); 
    else { 
     isAnyDialogOpen = true; 
     super.onClick(); 
    } 
} 
@Override 
public void onDismiss(DialogInterface dialog) { 
    Log.d(lTag, "dismiss, dialog= "+dialog); 

    isAnyDialogOpen = false; 
    if (dialog != null) super.onDismiss(dialog); 
}