Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 片段和片段(或活动)之间的侦听器_Android_Android Fragments_Lambda_Interface_Kotlin - Fatal编程技术网

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