有没有更好的方法在Fragment中放置监听器?
class FooFragment : Fragment() {
companion object {
private lateinit var listener: (Int) -> Unit
fun newInstance(listener: (Int) -> Unit): FooFragment {
Companion.listener = listener
return FooFragment()
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_foo, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btn.setOnClickListener {
listener(1234)
}
}
}
这个调用看起来非常整洁...
FooFragment.newInstance {
// Do something
}
我知道这段代码可能存在问题,因为在 Fragment
重新创建时可能会丢失监听器,而标准的做法是使用 onAttach(context: Context?)
方法。
但是我想要从其他 Fragment
(不是一个 Activity
)创建一个新的 FooFragment
实例。我可以使用类似于以下代码的东西:
private var listener: Listener? = null
interface Listener {
fun onFooClicked()
}
override fun onAttach(context: Context?) {
super.onAttach(context)
// listener = context as Listener
fragmentManager?.findFragmentById(R.id.fFooParent) as Listener
}
但是,FooFragment
中 onAttach(context: Context?)
方法内的这段代码将会起到反作用,因为我不想让 FooFragment
知道实例化它的类的任何信息。此外,我希望它可以是一个 Fragment
或一个 Activity
。
LocalBroadcastManager
发送和接收广播?这是组件间通信的推荐方式。 - TheWandererInt
参数并将其作为广播中的额外参数传递即可。 - TheWandererparentFragment as Listener
并在创建 Fragment 时使用childFragmentManager
,这样 Fragment 就不会知道创建它的 Fragment 的任何信息。 - AndreasReiff