是否有更好的干净方法将侦听器放入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?)
方式。
但是我想从其他FooFragment
(不是Fragment
)创建Activity
的新实例。我可以这样使用:
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
}
但是onAttach(context: Context?)
内FooFragment
方法内的这段代码会适得其反,因为我不希望FooFragment知道实例化它的任何类。此外,我希望它可以是Fragment
或Activity
。
答案 0 :(得分:2)
您可以创建一个实现监听器的baseActivity
class BaseFragmentActivity:AppCompatActivity(), FooFragment.Listener{}
然后扩展class YouFragmentActivity : BaseFragmentActivity
然后将确保每个片段托管活动都配备了容器,然后您可以将引用获取为BaseFragmentActivity
您可以将AppCompatActivity
替换为BaseActivity
的{{1}}