установить свойство диалога для всего проекта (для многих пользовательских диалогов)

Я ремонтирую большое приложение для Android, и у меня есть много пользовательских диалогов, которые наследуются от различных типов стандартных диалогов Android (AlertDialog, ProgressDialog,...).

Мне нужно добавить параметр «setCanceledOnTouchOutside (false)» для всех диалогов в приложении, потому что в ICS для этого параметра установлено значение true по умолчанию android 4.0 Dialog отменяется при касании за пределами диалогового окна

Я могу добавить строку «*dialog.setCanceledOnTouchOutside(false)» для каждого диалога в моем проекте, но это решение сложно поддерживать.

Я не могу наследовать от MyDialog, который наследуется от Dialog, потому что я наследую от AlertDialog, ProgressDialog,... тоже.

Вероятно, лучшим решением было бы установить все диалоги для всего проекта в одном месте или сделать какой-либо хак, который дает нам поведение по умолчанию из более старой версии Android, чем ICS, но я не знаю, возможно ли это и как это сделать?

Вы можете мне посоветовать?


person qbait    schedule 12.09.2012    source источник


Ответы (1)


все диалоги реализуют общий интерфейс, например,

interface DialogSettings {
   void setCancelOnTouchOutside(boolean cancel);
}

теперь реализуйте автономную версию этого,

class VersionAwareDialogSettings implements DialogSettings {
   private final Dialog d;

   DialogSettingsImpl(Dialog d) {
      this.d = d;
   }

   @Override
   void setCancelOnTouchOutside(boolean cancel) {
      if (Build.Version.SDK_INT ...) {
        d.setCancelOnTouchOutside(cancel);
      }
   }
}

теперь во всех ваших диалоговых классах реализуйте этот интерфейс, вот так,

class MyDialog extends AlertDialog implement DialogSettings {
...
  @Override
  public void setCancelOnTouchOutside(boolean cancel) {
    new VersionAwareDialogSettings(this).setCancelOnTouchOutside(cancel);
  }
}

это может показаться бесполезным, но это хорошее разделение задач. если вы хотите добавить параметр диалога с учетом версии, измените интерфейс, и все части вашего кода, которые вам нужно изменить, будут помечены. если вам нужно изменить настройку диалогового окна с учетом версии, просто измените его в одном месте: VersionAwareDialogSettings.

вы должны больше заботиться о написании правильного кода, чем пытаться сократить количество строк, которые вы пишете. Не знаю, как вы, а я могу печатать намного быстрее, чем думаю. мой мозг - узкое место.

person Jeffrey Blattman    schedule 12.09.2012
comment
Мне нужно одно и то же поведение на всех версиях Android: setCancelOnTouchOutside(false), но по умолчанию в ICS setCancelOnTouchOutside(true), а в более ранних версиях setCancelOnTouchOutside(false) Я думаю, что ваше решение отлично подходит для разных реализаций, зависящих от версии, но для моего случая это слишком сложно, не так ли? ? - person qbait; 13.09.2012