【问题标题】:set dialog property for whole project (for many custom dialogs)为整个项目设置对话框属性(对于许多自定义对话框)
【发布时间】:2012-09-12 22:11:13
【问题描述】:

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

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

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

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

可能最好的解决方案是将整个项目的所有对话框选项设置在一个地方,或者进行任何 hack,让我们在比 ICS 旧的 android 版本中默认行为,但我不知道这是否可能以及如何做这个?

你能给我建议吗?

【问题讨论】:

    标签: android dialog android-dialog


    【解决方案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

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

    【讨论】:

    • 我在所有 Android 版本上都需要相同的 bahaviour:setCancelOnTouchOutside(false) 但在 ICS 上默认为 setCancelOnTouchOutside(true) 而在较低版本上为 setCancelOnTouchOutside(false) 我认为您的解决方案非常适合不同版本的实现,但是对于我的情况来说太复杂了,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多