Android 片段和片段(或活动)之间的侦听器
有没有更好的干净方法将侦听器放入片段中Android 片段和片段(或活动)之间的侦听器,android,android-fragments,lambda,interface,kotlin,Android,Android Fragments,Lambda,Interface,Kotlin,有没有更好的干净方法将侦听器放入片段中 class FooFragment : Fragment() { companion object { private lateinit var listener: (Int) -> Unit fun newInstance(listener: (Int) -> Unit): FooFragment { Companion.listener = listener
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
}
我知道这段代码有问题,因为在重新创建片段
时可能会丢失侦听器,并且标准方法是使用onAttach(context:context?
方法
但是我想从其他片段
(不是活动
)创建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知道任何与它相关的类。此外,我希望它可以是一个片段
或一个活动
,您可以包装一个实现侦听器的baseActivity
class BaseFragmentActivity:AppCompatActivity(), FooFragment.Listener{}
然后扩展类YouFragmentActivity:BaseFragmentActivity
然后,它将确保每个片段托管活动都配备了容器,然后您就可以获得BaseFragmentActivity
您可以将
AppCompatActivity
替换为BaseActivity
其中BaseActivity:AppCompatActivity
为什么不直接使用LocalBroadcastManager
发送和接收广播?这是在组件之间进行通信的推荐方法。这是一个好主意,但我想避免使用样板文件。您正在做的是非常样板文件。只需创建一个helper方法,该方法接受Int
参数,并将其作为额外的参数传递到广播中。您可以使用parentFragment作为侦听器,并在创建片段时使用childFragmentManager
,这样片段对创建它的片段一无所知。如果我尝试实现片段中的接口
。另一方面,我不想让一个基本活动在其子级中包含许多要重写的方法。这不是一个好的实践……您可以拥有listener的内部类引用,并在基本活动中创建一个setter,该setter可以接受引用并进行设置,它将以多态方式工作,cast to base活动将允许您访问引用以调用方法(或者如果您同意答案,您可以调用该方法)我相信这是一个干净的方式,我希望看到一些参考资料或文件,它说它不是。虽然这是您的选择,但您可以创建一个单独的接口,而不是内部类,并遵循与baseFragment
classlook-at-class相同的方法,您将看到与任何类型的片段通信的接口数量,而安卓使用静态侦听器肯定是一种不好的做法。谢谢你@Pavneet_Singh