AndroidにおけるFragment機能の応用

2012年1月18日(水)
石立 宏志

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

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機能の説明と、実際のアプリをリリースする上で注意する点などをまとめます。

  • 「AndroidにおけるFragment機能の応用」サンプルプログラム(1)

  • 「AndroidにおけるFragment機能の応用」サンプルプログラム(2)

  • 「AndroidにおけるFragment機能の応用」サンプルプログラム(3)

テックファーム株式会社

2002年にIBMに入社、Webシステム開発やオフショア開発のサポートなどを経験。2005年にテックファーム株式会社に入社し、主にFeliCaやNFCなど非接触ICを使ったモバイルアプリケーションの開発に携わっていました。現在はスマートフォン向けのアプリケーション開発やソリューション提案をメインに活動しています。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています