2014-01-14 3 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; 

В диалоговом затруднительное, я поставил его к истинному, И после того, как я закрыть диалоговое окно, я поставил его на ложь. Оказалось, что даже это было проблематично, но решение было легче

@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); 
} 
Смежные вопросы