【问题标题】:How to pass data/object from fragment to activity in kotlin如何将数据/对象从片段传递到kotlin中的活动
【发布时间】:2021-05-27 09:01:59
【问题描述】:

我正在尝试使用意图将数据列表从片段传递到活动。从分片发送数据时,数据是存在的。但在活动中,它说数据为空。我不确定我传递数据的方式是否正确,或者有没有更好的方法将数据从片段传递到活动?

在片段中

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 = ""

}

【问题讨论】:

    标签: kotlin fragment


    【解决方案1】:

    将数据从片段传递到活动的更好方法?

    更好的方法是听者。你可以在 kotlin 中使用 interface 或 lambda。

    你的片段。在此示例中,类别是您的数据/对象

    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
    }
    

    【讨论】:

    • 这将在进程死亡后中断,因为系统重新创建了 Fragment,而不是开发人员。或者,开发人员的代码会覆盖系统的片段恢复逻辑,或者复制片段,或者擦除恢复的状态。无论哪种方式,这都是不正确的,除非首先使用片段标签检查片段是否存在以查看它是否为非空。
    • 我已经测试过进程死亡,它运行良好。您是否在进程死亡时测试过这段代码?
    • 只有在 findFragmentByTag 之后设置监听器才有效,而不仅仅是实例化
    • 我在活动的 onCreate() 方法中创建了一个片段。这是要点网址:gist.github.com/Shamsidin/24ac22a25a1553962035a0c3b89e91fb
    • 这只有效,因为在进程死亡时,您正在替换系统恢复的片段
    【解决方案2】:

    你能提供selectedBankCard的类定义吗?

    selectedBankCard的类型必须实现Serializable接口,否则无法在Activity中获取数据。

    
    data class Channels(
        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 = ""
    ) : Serializable 
    
    

    【讨论】:

    • Parcelable 也可以,所以@Parcelize 是一个不错的选择(即使 OP 最初使用可序列化)
    • 你可以试试。能否解决问题。
    【解决方案3】:

    如果您使用此代码从 Activity 启动片段,那么您可以轻松获得这样的返回数据。

    开始片段的代码

     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,))
    

    并在片段中编写此代码

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

    在活动中,您可以将退货数据作为商品获取

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多