「読み込み中」ダイアログの追加

「読み込み中」ダイアログの追加

Fragmentの修正も完了しましたので気になる点の修正に入りましょう。まずはWebページの読み込みの際に表示する「読み込み中」ダイアログを表示するように修正します。

「読み込み中」ダイアログはWebページの読み込みが始まってから終わるまで表示するようにします。Webページの読み込み状態が把握できるのはWebページ読み込み用Fragmentになるため、そちらに処理を追加しましょう。

実際のWebページの読み込みはFragment内にあるWebViewで行っています。WebViewからデータ読み込み開始などのイベント通知を受けるためには WebViewClient を継承したクラスでイベントに応じたメソッドをオーバライドし、WebViewに設定する必要があります。今回はページの読み込み開始・終了がわかれば良いので WebViewClient の onPageStarted() メソッドと onPageFinished() メソッドをオーバライドします。

それでは MyWebViewFragment.java に以下のコードを追加してください。なお、「読み込み中」ダイアログにはProgressDialogを使用しています。

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
 
    getWebView().setWebViewClient(new WebViewClient() {
      private ProgressDialog dialog = null;
 
      @Override
      public void onPageStarted(WebView view, String url, Bitmap favicon) {
          if (dialog == null || !dialog.isShowing()) {
              dialog = new ProgressDialog(getActivity());
              dialog.setTitle("読み込み中");
              dialog.show();
          }
      }
 
      @Override
      public void onPageFinished(WebView view, String url) {
          if (dialog != null) {
              dialog.dismiss();
              dialog = null;
          }
      }
    });
  }

リスト表示用Fragmentと同様に onActivityCreated() メソッドに処理を追加しています。WebViewにメソッドをオーバライドした WebViewClient を設定することで「読み込み中」ダイアログを表示しています。

それでは実際に実行してみましょう。画面左側リストをタップすると、以下の画面のように「読み込み中」ダイアログが表示されるようになっています。

図1:「読み込み中」ダイアログ(クリックで拡大)

Fragmentを修正することでActivityに手を加えることなく「読み込み中」ダイアログの表示ができるようになりました。今回はサンプルアプリということでFragment側にダイアログ表示処理を追加しましたが、Fragment側からActivity側に読み込み状態を通知するような形にしても良いと思います。

また、この対応でWebViewにWebViewClientを設定していますので、ページ内のリンクをタップしても標準ブラウザが起動しないようになっています(WebViewClientのデフォルト実装ではWebView内のリンクはWebViewで処理するようになるため)。

戻るキーを押した際の挙動の修正

いまのサンプルアプリはWebページ内のリンクをクリックした後に、前のページに戻ろうと思って戻るキーを押すとアプリが閉じてしまいます。これをブラウザっぽく、戻るキーを押すと前のページがある場合は前のページに、前のページがない場合はアプリを閉じるようにします。

この修正もWebページ表示用Fragmentを修正します。ただ、戻るキーのイベントを取得できるのはActivityですので、Fragment側に戻るページがあるかどうかを返すメソッドを追加し、Activityの onBackPressed() メソッドで呼び出すようにします。

まずは MyWebViewFragment.java に以下のメソッドを追加します。

  /**
  * Webページ履歴があり、戻ることが可能な場合はページバックする
  * @return ページバックした場合true、それ以外はfalse
  */
  public boolean goBack() {
    if (getWebView().canGoBack()) {
        getWebView().goBack();
        return true;
    }
  
    return false;
  }

これでFragment側の準備はできました。HelloFragmentActivity.java に onBackPressed() メソッドを追加し、このメソッドを呼び出しましょう。

  @Override
  public void onBackPressed() {
    final MyWebViewFragment wvf = (MyWebViewFragment) getFragmentManager()
            .findFragmentById(R.id.fragment2);
  
    if (wvf.goBack()) {
        // 戻るページがあった場合はActivityを閉じない
        return;
    }
  
    // 戻るページがない場合はActivityを閉じる
    finish();
  }

アプリを実行すると、Webページ履歴があった場合はページバック、ない場合はアプリが閉じる動きになっていると思います。

ここまでのソースコードは、会員限定特典としてダウンロードできます。記事末尾をご確認ください。

まとめ

今回はFragment機能を実際のアプリで利用する際の方針や実装の仕方を説明しました。実際のアプリではFragmentにどのような振る舞いを持たせるかは検討して使うことが重要となります。

次回は今回説明しきれなかったFragmentTransaction機能の説明と、実際のアプリをリリースする上で注意する点などをまとめます。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30