0

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

我必须为应用程序中的所有对话框添加选项“setCanceledOnTouchOutside(false)”,因为在 ICS 中我们默认将此选项设置为 true android 4.0 对话框在对话框窗口之外被触摸时被取消

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

我不能从继承自 Dialog 的 MyDialog 继承,因为我也继承自 AlertDialog、ProgressDialog……。

可能最好的解决方案是将整个项目的所有对话框选项设置在一个地方,或者进行任何黑客攻击,默认情况下从旧的 android 版本而不是 ICS 给我们提供默认行为,但我不知道这是否可能以及如何做到这一点?

你能给我建议吗?

4

1 回答 1

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.

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

于 2012-09-12T22:43:15.623 回答