AndroidにおけるFragment機能の応用
リスト表示用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)