Kotlin for Androidの使用に関しては、インターフェースの特定の実装があります。フラグメントからインターフェースをトリガーします。フラグメントがUIアクションを親アクティビティに伝達する必要がある一般的なシナリオを考えてみます。Javaでは、インターフェースを定義し、その「リスナー」インスタンスを作成し、インターフェースの親でアクションを実装/オーバーライドします。私にとってそれほど単純ではないのは、リスナーインスタンスの作成です。少しグーグルした後、実装例を見つけましたが、なぜそれが機能するのかわかりません。これを行うためのより良い方法はありますか?なぜ以下のように実装する必要があるのですか?
class ImplementingFragment : Fragment(){
private lateinit var listener: FragmentEvent
private lateinit var vFab: FloatingActionButton
//Here is the key piece of code which triggers the interface which is befuddling to me
override fun onAttach(context: Context?) {
super.onAttach(context)
if(context is FragmentEvent) {
listener = context
}
}
//Notice the onClickListener using our interface listener member variable
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val v: View? = inflater.inflate(R.layout.fragment_layout, container, false)
vFab = v?.findViewById(R.id.fh_fab)
vFab.setOnClickListener{listener.SomethingHappened()}
return v
}
}
interface FragmentEvent{
fun SomethingHappened()
}
このコードでlateinit var listener: FragmentEvent
は初期化する必要があり、することはできませんnull
。だからのonAttach
ように見えるはずです
override fun onAttach(context: Context?) {
super.onAttach(context)
if (context is FragmentEvent) {
listener = context
} else {
throw RuntimeException(context!!.toString() + " must implement FragmentEvent")
}
}
この場合、あなたは、実装するのを忘れた場合FragmentEvent
にはActivity
そうでない場合は、コールバックを使用する準備ができて、例外が発生しましたよ、あなた。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加