【问题标题】:How to attach a Listener with Navigation Components within 2 fragments如何在 2 个片段中附加带有导航组件的侦听器
【发布时间】:2021-06-17 15:00:24
【问题描述】:

我正在从 Fragment A 导航到 Fragment B ,在 Fragment BI 中需要触发在 Fragment A 中创建的回调,我不想为此使用共享视图模型,而我只想从片段A

目前这是我的方法

  class FragmentA: MyListener {
    
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            
             FragmentB().apply {
                this.myListener = this@FragmentA
            }
          myButton.setOnClickListener { findNavController().navigate(R.id.fragmentB) }
        }

 override fun launchFunction() { ... }

现在从我的 Fragment B 我想用我拥有的另一种方法触发这个监听器,但接口是 null

class FragmentB {

 val myListener: MyListener? = null

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

         myListener.launchFunction()
    }

但这不起作用,我怀疑是从 FragmentA 我正确地将侦听器应用到 FragmentB 的一个实例,该实例与 navController 用于导航的实例不同

我该如何处理?

谢谢

【问题讨论】:

标签: android kotlin android-fragments android-architecture-navigation


【解决方案1】:

用下面的代码试试就行了。

//Receiver class
class CustomResultReceiver(handler: Handler?, receiver: 
ResultReceiverCallBack) :
ResultReceiver(handler), Serializable {
private var mReceiver: ResultReceiverCallBack = receiver

override fun onReceiveResult(resultCode: Int, resultData: Bundle) {
    mReceiver?.onLaunch(true, resultCode, resultData)
}

interface ResultReceiverCallBack {
    fun onLaunch(action: Boolean, resultCode: Int, resultData: Bundle)
}

}



//Fragment A
Class FragmentA:Fragment(),CustomResultReceiver.ResultReceiverCallBack {
private lateinit var binding: FragmentABinding

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentABinding.inflate(inflater, container, false)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

binding.dialogButton.setOnClickListener{
findNavController().navigate(
    R.id.action_FragmentA_to_FragmentB,
    Bundle().apply { putSerializable("key", 
 CustomResultReceiver(Handler(requireContext().mainLooper), 
  this@FragmentA))})
}
}

override fun onLaunch(action: Boolean, resultCode: Int, resultData: 
Bundle) {
toast(“Fragment B launch“)
}

} 



//Fragment B 
Class FragmentB:Fragment(){
private lateinit var binding: FragmentBBinding
private var resultReceiver: ResultReceiver? = null

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentBBinding.inflate(inflater, container, false)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
 arguments.let {
 resultReceiver = arguments?.getSerializable("key") as 
 CustomResultReceiver
}
resultReceiver?.send(1,Bundle())
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多