AndroidにおけるFragment機能の応用

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

前回のおさらいと今回のテーマ

前回の記事「Androidアプリのイベント処理とFragment」では、Androidアプリのイベント処理の基本とFragment機能の概要・サンプルアプリを作成しました。AndroidにFragment機能が追加された背景が理解いただけたかと思います。

今回は、前回作成したサンプルアプリをもとにFragment機能について掘り下げます。

実際のアプリでFragment機能をどのように利用するかを説明し、Fragmentに振る舞いを持たせる方法を説明します。

サンプル一式は、会員限定特典としてダウンロードできます。記事末尾をご確認ください。

Fragmentに振る舞いを持たせる

前回作成したサンプルアプリを使ってみると気になる点がいくつかあると思います。例えば、

  • 左側のリストをタップしても、「読み込み中」などの表示が出ないため、反応したかどうかがわかりづらい
  • Webページでリンクをクリックしたら、ブラウザが起動される
  • 戻るキーを押したら、前に表示していたWebページに戻ると思っていたのにアプリが閉じてしまう

などなど、実際に使ってみるといろいろと気になります。

今回は上記の気になる点を修正するため、前回作成したサンプルアプリを修正します。

修正する前に…

上記の気になる点を修正するためには、2つの方向性があります。

  • 画面の左側・右側を構成するFragmentを修正し、上記の振る舞いをFragmentに持たせる
  • Activityを修正し、上記の振る舞いを持たせる

いまのサンプルアプリはActivityに全ての振る舞いを記述しています。実際のソースコードを見てわかる通り、Webページを表示する処理はActivity内に記述されており、画面左側のURL一覧をタップした際のイベントハンドラ内に画面右側のWebページを表示する処理が記述されています。

そのため、画面を構成する2つのFragmentが強く結びついてしまい、もしスマートフォン用に画面を分けることになった場合の対応が困難です。2つのFragmentの間でやりとりしなければいけないデータはURLだけですので、今回はFragmentを修正して対応し、ActivityはFragment間のデータ受け渡しを行う形に修正します。

Fragmentの修正

振る舞いを記述する前にまずはFragmentを修正し、Fragment間の結びつきを弱くしましょう。修正する点は以下の通りです。

  • 画面左側のリストはActivityから表示する一覧のデータをもらい、タップされたURLを通知する
  • 画面右側のWebページ表示はActivityから渡されたURLを表示する

Webページ表示用Fragmentの修正

まずは画面右側のWebページ表示用のFragmentを修正しましょう。ActivityからURLを渡せるように MyWebViewFragment.java に以下のメソッドを追加します。

  public void loadUrl(final String url) {
    getWebView().loadUrl(url);
  }

メソッドを追加したら、それに合わせて HelloFragmentActivity.java も以下のように修正します。

修正前:

  // 画面左側のリスト項目をタップしたときのイベント処理
  listFragment.getListView().setOnItemClickListener(
    new ListView.OnItemClickListener() {
      public void onItemClick(AdapterView<?> listView, View v,
          int pos,
          long id) {
        // タップした位置のURLを取得し、画面右側に表示させる
        Map<String, String> m = (Map<String, String>) adapter
          .getItem(pos);
        wvf.getWebView().loadUrl(m.get("url"));
      }
    });

修正後:

  // 画面左側のリスト項目をタップしたときのイベント処理
  listFragment.getListView().setOnItemClickListener(
    new ListView.OnItemClickListener() {
      public void onItemClick(AdapterView<?> listView, View v,
          int pos,
          long id) {
        // タップした位置のURLを取得し、画面右側に表示させる
        Map<String, String> m = (Map<String, String>) adapter
          .getItem(pos);
        wvf.loadUrl(m.get("url"));
      }
    });

ハイライト表示の箇所が変更箇所となります。

これでちゃんと動作するかを確認しましょう。前回のサンプルアプリ同様、左側のリストをタップするとWebページが表示されることを確認してください。

  • 「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メルマガ会員のサービス内容を見る

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