如何在kotlin中将数据/对象从片段传递到活动

如何在kotlin中将数据/对象从片段传递到活动,kotlin,fragment,Kotlin,Fragment,我试图使用intent将数据列表从片段传递到活动。从片段发送数据时,数据是存在的。但在活动中,its表示数据为空。我不确定我传递数据的方式是否正确,或者是否有更好的方式将数据从片段传递到活动 零碎 private var selectedBankCard: Channels = Channels //get a list of data from BE override fun onClick(view: View?) { when (view?.id) {

我试图使用intent将数据列表从片段传递到活动。从片段发送数据时,数据是存在的。但在活动中,its表示数据为空。我不确定我传递数据的方式是否正确,或者是否有更好的方式将数据从片段传递到活动

零碎

private var selectedBankCard: Channels = Channels //get a list of data from BE
    override fun onClick(view: View?) {
        when (view?.id) {
            R.id.bankcard_layout -> {
                    try {
                        if (activity != null) {
                            val intent =
                                Intent(context, BankCardListActivity::class.java)
                            if (selectedBankCard != null) {
                                intent.putExtra("BANKCARDINFORMATION", selectedBankCard) //upon debug, i can see a selectedBankCard is not null
                            }
                            startActivityForResult(intent, 10001)
                        }
                    } catch (e: Exception) {
                     
                    }
                }
            }
        }
    }
活跃

class AutoReloadBankCardListActivity : BaseActivity() {
private lateinit var channels: Channels
   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.bank_card)
        if (intent == null) {
            return
        }
        channels = intent.getSerializableExtra("BANKCARDINFORMATION") as Channels // upon debug, getSerializableExtra returns null
        
    }


class Channels : Serializable {
    var newCard = false
    var disable = false
    var disableCode: String = ""
    var description: String = ""
    var channelType: String = ""
    var payBrands: List<String>? = null
    var channelIndex: String = ""
    var payToolType: String = ""
    var selected = false
    var payBrand: String = ""
    var extendInfo: ExtendInfo? = null
    var disableReason: String = ""
    var icon: String = ""
    var chargeIndex: String = ""

}
class AutoReloadBankCardListActivity:BaseActivity(){
专用lateinit var通道:通道
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(右布局,银行卡)
if(intent==null){
返回
}
channels=intent.getSerializableExtra(“BANKCARDINFORMATION”)作为通道//调试时,getSerializableExtra返回null
}
类通道:可序列化{
var newCard=false
var disable=false
var disableCode:String=“”
变量说明:String=“”
var channelType:String=“”
var payBrands:列表?=空
var channelIndex:String=“”
var payToolType:String=“”
所选变量=false
var payBrand:String=“”
变量extendInfo:extendInfo?=null
var disableReason:String=“”
变量图标:String=“”
var chargeIndex:String=“”
}

能否提供所选银行卡的类别定义

所选银行卡类型必须实现可序列化接口,否则无法在活动中获取数据


数据类通道(
var newCard=false,
var disable=false,
var disableCode:String=“”,
变量说明:String=“”,
var channelType:String=“”,
var payBrands:列表?=空,
var channelIndex:String=“”,
var payToolType:String=“”,
var selected=false,
var payBrand:String=“”,
变量extendInfo:extendInfo?=null,
var disableReason:String=“”,
变量图标:String=“”,
var chargeIndex:String=“”
):可序列化
将数据从片段传递到活动的更好方法

更好的方法是侦听器。您可以在kotlin中使用接口或lambda

在本例中,您的fragment.Category是您的数据/对象

class MyFragment : Fragment() {
        var listener: ((category: Category) -> Unit)? = null


        fun sendCategoryToListener(category: Category) {
            listener?.invoke(category)
        }
}
活动中的代码

val fragment = MyFragment()
fragment.listener = { category ->
    // Do what you want with your object
}

如果您使用此代码从活动中启动一个片段,那么您可以很容易地获得如下返回数据

开始片段的代码

 fun addFragment(
    fragment: Fragment,
) {
    supportFragmentManager.beginTransaction()
        .add(R.id.nav_host_fragment, fragment)
        .addToBackStack(BACK_STACK)
        .commit()
}

addFragment(ABCFragment(item->{//here the item is your return data}))
您可以像这样添加片段

 addFragment(ABCFragment( private val returnData: (item: ABCModel) -> Unit,))
要获得返回数据,可以添加如下片段

 addFragment(ABCFragment( private val returnData: (item: ABCModel) -> Unit,))
然后在片段中编写这个代码

    class ABCFRagment(private val returnData: (item: ABCModel) -> Unit,):Fragment{
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    item.invoke(data)
}}

在活动中,您可以将返回数据作为项

获取,这将在进程终止后中断,因为系统重新创建片段,而不是开发人员。或者,开发人员的代码覆盖系统的片段恢复逻辑,或者复制片段,或者删除还原状态。无论哪种方式,这都是不正确的,除非Fragm首先使用其片段标记检查ent是否存在。Parcelable也可以工作,因此
@Parcelize
是一个不错的选择(即使OP最初使用serializable),我已经更新了类Channel。您可以尝试它。它是否能解决问题。