0

私は大きなAndroidアプリを修復し、さまざまなタイプの標準Androidダイアログ(AlertDialog、ProgressDialogなど)から継承する多くのカスタムダイアログを持っています。

アプリ内のすべてのダイアログにオプション「setCanceledOnTouchOutside(false)」を追加する必要があります。これは、ICSではこのオプションがデフォルトでtrueに設定されているため、Android4.0ダイアログはダイアログウィンドウの外側に触れるとキャンセルされます

プロジェクト内のすべてのダイアログに「*dialog.setCanceledOnTouchOutside(false)」という行を追加できますが、これは解決策を維持するのが困難です。

AlertDialog、ProgressDialogなどからも継承しているため、Dialogから継承しているMyDialogからは継承できません。

おそらく最善の解決策は、プロジェクト全体のすべてのダイアログオプションを一箇所に設定するか、ICSよりも古いAndroidバージョンからデフォルトで動作するハックを作成することですが、それが可能かどうか、そしてこれを行う方法はわかりませんか?

アドバイスしてもらえますか?

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);
  }
}

これは非常に雑然としたように見えるかもしれませんが、関心の分離です。バージョン対応のダイアログ設定を追加する場合は、インターフェイスを変更すると、変更が必要なコードのすべての部分にフラグが付けられます。ベリソン対応のダイアログ設定の実装を変更する必要がある場合は、次の1か所で変更するだけですVersionAwareDialogSettings

書く行数を減らすよりも、正しいコードを書くことに関心を持つ必要があります。あなたのことはわかりませんが、思ったよりずっと速くタイプできます。私の脳はボトルネックです。

于 2012-09-12T22:43:15.623 に答える