<HOME

Dialogを使用してメッセージを表示する30分


Dialogを使用してメッセージをポップアップ表示する方法について学習します。

  1. 「DialogTraining」アプリを作成します。

    1. Android Studioを起動し、新規プロジェクトを作成します。

      「Welcome to Android Studio」画面の場合は、「Start a new Android Studio project」をクリックします。

      別のプロジェクトが開いている場合は、ツールバーから「File」→「New」→「New Project...」をクリックします。

    2. HelloWorldの時と同じようにプロジェクトを作成していきます。

      アプリ名は「DialogTraining」としてください。

      今回は「Backwards Compatibility (AppCompat)」のチェックは外しておきます。

  2. Dialogの実装方法は、Android2.x以前とAndroid3.0以降で大きく変わっています。

    過去の実装方法はこちらを確認してください。

    過去の実装方法は、メモリリークの要因になりますので、Android3.0以降では使用しないようにしてください。

    DialogはActivityのContextを参照しており、Dialogからの参照が残っているとActivityを解放できなくなります。

    過去の実装方法では、Dialogの解放がActivityのライフサイクルから独立してしまっており、Dialogが適切なタイミングで解放されずに残ってしまうことがあります。

    そのため、残ってしまったDialogからの参照によりOSがActivityを解放できずに、メモリリークしてしまうことがあります。

  3. Dialogを表示するには、

    • 「DialogFragment」を継承したクラスのインスタンスを生成し、「show」メソッドを実行する

    • 「DialogFragment」を継承したクラスの「onCreateDialog」メソッドで、Dialogインスタンスを生成する

    という処理を行う必要があります。

    DialogFragmentは、FragmentというUIコンポーネントのひとつです。

    Fragmentは、超ざっくりいうと、「サブ アクティビティ」のようなものです。

    FragmentもActivityのようにライフサイクルをもっており、その状態遷移はホスト(親)のActivityに引きずられます。

    つまり、ActivityがResumeやPauseになったり破棄されたりする際には、

    そのActivity上で動作しているFragemntも同様にResumeやPauseになったり破棄されたりするということです。

    これにより、過去の実装方法で問題となっていたメモリリークを回避できます。


    詳細については公式サイトに記載されています。

    Fragment は、Activity でのユーザー インターフェースの挙動や部位を表すものです。 1 つのアクティビティに複数のフラグメントを組み合わせてマルチペインの UI をビルドしたり、複数のアクティビティでフラグメントを再利用したりできます。 フラグメントとは、アクティビティのモジュール型セクションのようなもので、独自のライフサイクルを持ち、独自の入力イベントを受信します。フラグメントはアクティビティの実行中に追加したり削除したりできます(別のアクティビティで再利用できる「サブ アクティビティ」のようなものです)。

    フラグメントは常にアクティビティに埋め込まれている必要があり、フラグメントのライフサイクルはホストのアクティビティのライフサイクルの影響を直接受けます。 たとえば、アクティビティが一時停止しているとき、その中のすべてのフラグメントも一時停止し、アクティビティが破棄されると、すべてのフラグメントも破棄されます。 ただし、アクティビティの実行中(ライフサイクルで再開された状態)は、追加や削除といった操作は各フラグメントだけで行うことができます。 このようなフラグメントのトランザクションを実行するとき、アクティビティで管理されているバックスタックにそれを追加することもできます。 アクティビティの各バックスタック エントリは、発生したフラグメントのトランザクションの記録になります。 バックスタックでは、「戻る」を選択するとフラグメントのトランザクションを戻す(前に戻る)ことができます。
  4. 実際にアプリに処理を追加して、動作を確認してみましょう。

    1. 「DialogFragment」を継承したクラスを作成します。今回は6種類作成します。

      また、そこそこ数も多いですし、役割が同じ(Dialogを表示する)なので、今回はついでに、これらのクラスはサブパッケージにまとめてしまいましょう。

      1. プロジェクトウィンドウでパッケージを右クリックして「New」→「Package」を選択し、サブパッケージ「dialog」を作成します。

      2. サブパッケージ「dialog」を右クリックして「New」→「Java Class」を選択し、DialogFragmentを継承したクラスを作成します。

        クラス名は、

        • DialogFragmentEx1

        • DialogFragmentEx2

        • DialogFragmentEx3

        • DialogFragmentEx4

        • DialogFragmentEx5

        • DialogFragmentEx6

        とします。

      3. 各DialogFragmentの処理を実装していきます。

        • DialogFragmentEx1.java

          コードを表示するにはJavaScriptを有効にしてください

          「AlertDialog.Builder」インスタンスを生成し、Dialog表示に必要なパラメータをセットしています。

          AlertDialogインスタンスは、まずBuilderを生成して必要なパラメータをセットし、
          Builderの「create」メソッドをコールすることで生成できます。


          Builderのパラメータ設定メソッドはBuilder自信を返却するため、上記のように連続してメソッドをコールするような書き方ができます。

          (丁寧に記述すると、以下の処理を実行しているということです。)

          コードを表示するにはJavaScriptを有効にしてください

          Builderの「setTitle」メソッドで、Dialog表示時にタイトル部に表示されるテキストをセットしています。

          Builderの「setMessage」メソッドで、Dialog表示時にメッセージ部に表示されるテキストをセットしています。

          Builderの「create」メソッドで、AlertDialogインスタンスを生成しています。

        • DialogFragmentEx2.java

          コードを表示するにはJavaScriptを有効にしてください

          Builderの「setIcon」メソッドで、Dialog表示時にタイトル部に表示されるアイコン画像をセットしています。


          Builderの「setPositiveButton」「setNegativeButton」メソッドで、
          Dialog下部に表示されるボタンのテキストと、クリック時のイベントリスナをセットしています。

          ボタンには「Positive」「Neutral」「Negative」という種類があり、
          「OK」はPositive、「Cancel」はNegative、といったように使い分けられます。

          これらのボタンが押されると、リスナの有無にかかわらずDialogは閉じられます。

          ただDialogを閉じるためにボタンを表示させたい(「閉じる」ボタンなど)場合はリスナにnullをセットすればOKです。

        • DialogFragmentEx3.java

          コードを表示するにはJavaScriptを有効にしてください

          Builderの「setItems」メソッドで、リスト表示する内容(文字列の配列)と、
          アイテムクリック時のイベントリスナをセットしています。

          アイテムクリック時には、リスナの有無にかかわらずDialogは閉じられます。


          後述する独自Viewをセットする方法でListViewを表示しても良いですが、
          AlertDialogには上記のように遥かに楽にリストを表示できるAPIが用意されています。

        • DialogFragmentEx4.java

          コードを表示するにはJavaScriptを有効にしてください

          DialogFragmentの「setCancelable」メソッドで、BackキーでDialogを閉じることができるか否かをセットしています。

          デフォルト(何もセットしない場合)は「true」です。

          「false」をセットすると、BackキーでDialogを閉じることができなくなります。

          ボタン操作やタイムアウトで閉じる処理を実装してください。

        • DialogFragmentEx5.java

          コードを表示するにはJavaScriptを有効にしてください

          Builderの「setView」メソッドで、独自Viewをセットしています。

        • DialogFragmentEx6.java

          コードを表示するにはJavaScriptを有効にしてください

          DialogFragmentの「onDismiss」メソッドで、
          Dialogがdismissされた(閉じられた)際のイベントリスナをセットしています。

          コールバックメソッド「onDismiss」は、
          Backキーや各ボタン押下、外部からのdismissメソッド実行などの要因に関わらず、
          Dialogがdismissされた際にコールされます。

    2. 「activity_main.xml」を以下のように変更します。

      コードを表示するにはJavaScriptを有効にしてください

    3. 「MainActivity.java」を以下のように変更します。

      コードを表示するにはJavaScriptを有効にしてください

      ボタンが押された際に、各DialogFragment継承クラスのインスタンスを生成し、showしています。


      showメソッドの引数には、ActivityがもつFragmentManagerインスタンスと、任意のタグを指定します。

      これにより、ActivityがもつFragmentManagerインスタンスにDialogFragmentが追加され、Activity上で動作することができるようになります。

    4. アプリを起動して、上からボタンを押して、Dialogの表示・動作を確認してみましょう。

Dialogに関する詳細については公式ドキュメントに記載されています。

また、Androidは先人たちがネット上にたくさんの情報を残してくれています。

これらも活用して、是非このAPIを有効に使えるようになってください。