簡単にアクティビティとfragmentとで通信したいんだという人向き。

 FragmentをAndroidStudioのプロジェクトツリービューから実装すると、Fragmentクラスを継承したクラスが作成され、そこにテンプレートが記述されている。このテンプレートは便利なので、このまま利用するのがいい。このテンプレートが何を意味しているかはこちらで詳しく
 テンプレートではインターフェースが設定されているので、Fragmentを利用するアクティビティでは、そのインターフェースを継承して、override fun onFragmentInteraction(uri: Uri) {}というメソッドを実装しておくこと。これがFragmentからコールバックされるメソッドになる。
 またテンプレートでは、Fragmentに下記のようなメソッドが実装されており、listenerに呼び出しもとのアクティビティのインスタンスが入っている。ので、このlistenerをキャストすればアクティビティのメソッドや変数などに自由にアクセスすることができる。これを利用してFragment側からアクティビティのメソッドをいじることができるし、さきほど実装したonFragmentInteractionも実行できるので、何かイベントが発生したらこのメソッドを実行して
引数により処理を振り分ければいい。


override fun onAttach(context: Context) {
    super.onAttach(context)
    if (context is OnFragmentInteractionListener) {
        listener = context
    } else {
        throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener")
    }
}

 アクティビティ側からフラグメントを操作する場合にはFragmentManagerを利用してfragmentを取得する。
 静的に設定している場合には、xmlファイルに設定したIDから呼び出すのでfindFragmentByIdを利用する。動的に生成した場合にはaddしたときのaddの第二引数にfragmentを一意に区別する文字列を記述して登録しておく。そしてfragmentを呼び出すときにはfindFragmentByTagを利用して設定した文字列で呼び出す。
 fragmentとして変数に入っているので、自分で作成したクラス名でキャストすればフラグメント側に記述した関数などに自由にアクセスできる。

supportFragmentManager.findFragmentById(R.id.fragment01)?.let {
    (it as Sub01Fragment).test()
}
supportFragmentManager.findFragmentByTag("tag")?.let {
    (it as Sub01Fragment).test()
}