LoginSignup
39
42

More than 5 years have passed since last update.

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

Posted at

【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の基本については今回の記事でいったん終わりにしようと思います。

参考

39
42
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
42