非父组件场景下Fragment向Activity传递taskId失败求解决方案
问题:向非父组件的Activity传递taskId失败
需要从Fragment向非其父组件的Activity传递特定的taskId,但数据传递失败。
已尝试方案
- 使用Intent传递数据
- 使用Bundle传递数据
- 接口(仅当Activity是Fragment父组件时才认为接口有效)
- SharedViewModel
- 使用LocalBroadcastManager传递数据
推测核心问题在于生命周期。在Fragment中,可通过以下方式正常获取数据:
mTaskContext = (activity as TaskActivityInterface).taskContext
override fun onOptionsItemSelected(item: MenuItem?): Boolean { when (item?.itemId) { R.id.barcode_icon -> showScanActivity() } return super.onOptionsItemSelected(item) }
Intent传递失败情况
尝试通过Intent启动TransferScanActivity并附加数据,但Activity中接收的值为null(Fragment中该值非空),相关代码:
private fun showScanActivity() { startActivity(Intent(context, TransferScanActivity::class.java)) }
LocalBroadcastManager传递失败情况
尝试LocalBroadcastManager方案,调试显示数据已正常发送,但Activity中注册广播接收器后无法接收到数据。
Fragment中的发送代码:
private fun showScanActivity() { sendDataToActivity(mTaskContext.id) startActivity(Intent(context, TransferScanActivity::class.java)) } private fun sendDataToActivity(data: Long) { val intent = Intent("SEND_TASKID") intent.putExtra("TASK_ID", data) LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) }
Activity中的广播接收器代码:
private val mTaskIdBroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Log.d("TaskIdA", "Received broadcast") val data = intent?.getLongExtra("TASK_ID", 0) Log.d("TaskIdA", "onReceive: $data") } }
内容的提问来源于stack exchange,提问作者Cuyer
相关产品推荐
相关产品推荐

