Help us understand the problem. What is going on with this article?

【Android】Androidの基本を覚えた後に覚えたいこと~はじめてのFragment③~

More than 5 years have passed since last update.

【Android】Androidの基本を覚えた後に覚えたいこと~はじめてのFragment①~
【Android】Androidの基本を覚えた後に覚えたいこと~はじめてのFragment②~
の続きです。

今回はActivityとの連携をまとめます。

連携

ActivityとそのActivityに属するFragmentは直接やりとりをすることができます。

FragmentがActivityを呼ぶ、使うために

SampleFragment.java
View listView = getActivity().findViewById(R.id.list);

getActivityメソッドで自身が紐付けられているActivityのインスタンスを取得でき、処理をすることができます。
上の例ではviewを取得しています。

ActivityがFragmentを呼ぶ、使うために

MainActivity.java
SampleFragment fragment = (SampleFragment) getFragmentManager().findFragmentById(R.id.sample_fragment);

findFragmentByIdメソッド、またはfindFragmentByTagメソッドを用いることでFragmentのインスタンスを取得できます。

イベントの共有

Fragment上で発生したイベントをActivityに通知する方法です。
たとえば、Fragment上でのクリックイベントは、Activityに自動的に通知されるわけではありません。
クリックイベントをActivityにも通知したければ、通知するように処理を入れなければいけません。

大まかに説明すると、Frgamentにコールバックのためのインターフェースを定義し、Activityでそのインターフェースを実装する、ということをします。
以下に詳しく説明します。

今回やりたいこと

ListFragmentの一項目をクリックしたら、Activity上でそのクリックを検知してLogを出力します。

Fragmentにコールバック用のインターフェースを定義する

SampleFragment.java
public static class SampleFragment extends ListFragment {

    public interface OnItemSelectedListener {
        public void onItemSelected();
    }
}

今回はListFragmentを継承しています。
このような感じでFragmentにコールバック用のインターフェースを定義します。

Activityでインターフェースを実装する

MainActivity.java
public class MainActivity extends FragmentActivity implements SampleFragment.OnItemSelectedListener{

    @Override
    public void onItemSelected(){
        Log.d("MainActivity ","excute onItemSelected()");
    }

}

通知したいActivityで、Fragmentに定義したコールバック用のインターフェースを実装します。
これから、Fragment上でのリストに対するクリック動作が発生したときにonItemSelected()が実行されるようにしていきます。

FragmentからActivityに通知する

SampleFragment.java
public static class SampleFragment extends ListFragment {

  // 先ほど定義したコールバック用のインターフェース    
    public interface OnItemSelectedListener {
        public void onItemSelected();
    }

    // 自身と紐づいたActivityの参照が格納される
    OnItemSelectedListener listener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // 紐づいたActivityの参照を格納。OnItemSelectedListenerを実装していない場合はExceptionが発生します。
        try {
            listener = (OnItemSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnItemSelectedListener");
        }
    }

    @Override
    // ListFrgament定義されている。リストが選択されると呼ばれる。
    public void onListItemClick(ListView l, View v, int position, long id) {
        listener.onItemSelected();
    }

}

onAttach()は、Activityと紐づいたときに呼ばれるメソッドで、引数のActivityは紐づくActivityです。
あとはActivityにFragmentを追加する処理を書くことで、Fragmentのクリック動作をActivityに通知することが可能になります。

Fragmentの基本については今回の記事でいったん終わりにしようと思います。

参考

chihiro
jrits
信頼と魅力のある先進のITをもとに、お客様のワークスタイル・イノベーションの実現を目指します。
http://www.jrits.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした