为整个项目设置对话框属性(对于许多自定义对话框)

时间:2012-09-12 22:11:13

标签: android dialog android-dialog

我修复了大的Android应用程序,我有很多自定义对话框,它们继承了各种类型的标准android对话框(AlertDialog,ProgressDialog,...)。

我必须为app中的所有对话框添加选项“setCanceledOnTouchOutside(false)”,因为在ICS中我们默认将此选项设置为true android 4.0 Dialog gets canceled when touched outside of dialog window

我可以为项目中的每个对话框添加“* dialog.setCanceledOnTouchOutside(false)”行,但这很难维护解决方案。

我无法从继承自Dialog的MyDialog继承,因为我继承了AlertDialog,ProgressDialog,......也是。

可能最好的解决方案是将整个项目的所有对话框选项设置在一个地方,或者通过默认行为从ICS以前的旧版本中获取默认行为,但我不知道它是否可行以及如何做此?

你可以告诉我吗?

1 个答案:

答案 0 :(得分: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);
  }
}

这看起来像是一种愚蠢的行为,但这是一个很好的分离关注点。如果要添加版本感知对话框设置,请更改界面,并标记需要修改的代码的所有部分。如果您需要更改受版权保护的对话框设置的impl,只需在一个位置更改它:VersionAwareDialogSettings

你应该更关心编写正确的代码,而不是试图减少你编写的行数。我不了解你,但我的打字速度比我想象的快得多。我的大脑是瓶颈。