リスト表示用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だけを受け渡す形になっています。再度アプリを実行してみて動作が変わってないことを確認してください。

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

人気記事トップ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