AndroidにおけるFragment機能の応用

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

リスト表示用Fragmentの修正

次は画面左側のリスト表示用のFragmentを修正します。このFragmentは

  • Activityから一覧に表示するデータを受けとるメソッド
  • ActivityにタップされたURLを通知するメソッド

を追加する必要があります。

それではデータを受けとるメソッドを追加しましょう。以下のメソッドを MyListFragment.java に追加してください。

  /**
  * 表示するタイトルとURLのリストを設定する
  * @param list 表示するタイトルとURLのリスト
  */
  public void setUrlList(List<Map<String, String>> list) {
    final SimpleAdapter adapter = new SimpleAdapter(getActivity(), list,
      android.R.layout.simple_list_item_2,
      new String[] {
        "title",
        "url" },
      new int[] {
        android.R.id.text1,
        android.R.id.text2 });

    setListAdapter(adapter);
  }

次にActivityにタップされたURLを通知するメソッドを追加します。リスト表示用のFragmentにURLを通知するためのInterfaceを作成し、Activity側で実装してもらう形にします。

以下のコードを MyListFragment.java に追加し、通知するためのInterfaceを作ります。

  // リスナー保管用のインスタンス変数
  private UrlClickListener urlClickListener = null;
  
  /**
  * リスナーを設定する
  * @param listener URLを通知するリスナー
  */
  public void setUrlClickListener(UrlClickListener listener) {
    this.urlClickListener = listener;
  }
 
  /**
  * URLを通知するためのインターフェース
  */
  public interface UrlClickListener {
    public void onUrlClick(final String url);
  }

次にリストをタップされた際のイベント処理もFragmentに移します。以下のコードを MyListFragment.java に追加してください。

  /**
  * Fragmentが属するActivityが作成された際に呼び出されるメソッド
  */
  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
  
    // 画面左側のリスト項目をタップしたときのイベント処理
    getListView().setOnItemClickListener(
      new ListView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> listView, View v,
          int pos,
          long id) {
        // タップした位置のURLを取得し、画面右側に表示させる
        Map<String, String> m =
               (Map<String, String>) listView.getAdapter()
                      .getItem(pos);
  
        if (urlClickListener != null) {
            urlClickListener.onUrlClick(m.get("url"));
        }
      }
    });
  }

ここで onActivityCreated() なるメソッドが初めて出てきました。これはFragmentのライフサイクルの遷移によって呼び出されるメソッドとなります。

FragmentもActivityと同様にライフサイクルを持っており、そのライフサイクルの遷移に応じたメソッドがAndroid側から呼び出されます。今回用いた onActivityCreated() というメソッドはFragmentが属しているActivityの onCreate() メソッドが完了した後に呼び出されるメソッドです。

Fragmentのライフサイクルの詳細に関しては、以下のURLをご確認ください。
→参照:Fragments | Android Developers

これで画面左側のリスト表示用Fragmentの修正も完了しました。Fragmentの修正に合わせActivityを修正しましょう。

HelloFragmentActivity.java の onCreate() メソッドを以下のコードに置き換えてください。

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
 
    final MyListFragment listFragment = (MyListFragment) getFragmentManager()
           .findFragmentById(R.id.fragment1);
    final MyWebViewFragment wvf = (MyWebViewFragment) getFragmentManager()
           .findFragmentById(R.id.fragment2);
  
    listFragment.setUrlList(DATA);
    listFragment.setUrlClickListener(new MyListFragment.UrlClickListener() {
        @Override
        public void onUrlClick(final String url) {
           wvf.loadUrl(url);
        }
     });
  }

Activityの onCreate() メソッドがだいぶすっきりしました。先ほどの修正方針通り、Activityは2つのFragment間でURLだけを受け渡す形になっています。再度アプリを実行してみて動作が変わってないことを確認してください。

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

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

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