首页 > 解决方案 > 如何从活动更新片段中的视图

问题描述

我正在使用布尔值来更新片段中的视图。

它正在从片段中工作,但是在活动中有触发布尔值的代码,但是直到我再次手动转到片段之前,视图没有得到更新。

活动代码:

    billingClientLifecycle.purchaseUpdateEvent.observe(this, Observer {
        it?.let {
            Log.d("King", "John it 1$it")
            registerPurchases(it)
            subbed = if (it.isEmpty()) {
                Log.d("King", "inside empty")
                false
            } else {
                Log.d("King", "inside not empty")
                true
            }

        }
    })

片段代码

if (subbed){
        Log.d("King", "insideifsubbed$subbed")
        matchesBinding.homeBasicMessage.visibility = View.VISIBLE
        matchesBinding.homePaywallMessage.visibility = View.GONE
        matchesBinding.homeAccountHoldMessage.visibility = View.GONE
        matchesBinding.homeTransferMessage.visibility = View.GONE
    }else{
        matchesBinding.homeBasicMessage.visibility = View.GONE
        matchesBinding.homeAccountHoldMessage.visibility = View.GONE
        matchesBinding.homeTransferMessage.visibility = View.GONE
        matchesBinding.homePaywallMessage.visibility = View.VISIBLE

        Log.d("King", "insideelsesubbed$subbed")
    }

标签: androidkotlin

解决方案


在您的中实现一个侦听器,Fragment以便您Activity每次想要更新任何新信息时都可以向它发送回调。

例如,您可以创建

interface SubbedUpdateListener {
    fun onSubUpdate(subbed: Boolean)
}

并实现相关字段和设置器

var mSubbedUpdateListener: SubbedUpdateListener? = null; private get
fun setSubbedUpdateListener(subbedUpdateListener: SubbedUpdateListener){
    mSubbedUpdateListener = subbedUpdateListener
}

最后是调用代码:

billingClientLifecycle.purchaseUpdateEvent.observe(this, Observer {
    it?.let {
        Log.d("King", "John it 1$it")
        registerPurchases(it)
        subbed = if (it.isEmpty()) {
            Log.d("King", "inside empty")
            false
        } else {
            Log.d("King", "inside not empty")
            true
        }

        if(mSubbedUpdateListener != null){
            mSubbedUpdateListener.onSubUpdate(subbed)
        }
    }
})

在你的内部Activity,当你创建新的Fragment,在onAttachonCreate方法内部时,你可以使用context传入的,这应该是你的调用Activity,将它转换为你的Activity类,然后调用activity.setSubbedUpdateListener(this)如果你使用Fragmentto implements SubbedUpdateListener。否则,您还可以传入SubbedUpdateListener. 在实现内部,您可以检查:

override fun onSubUpdate(subbed: Boolean){
    if (subbed){
        Log.d("King", "insideifsubbed$subbed")
        matchesBinding.homeBasicMessage.visibility = View.VISIBLE
        matchesBinding.homePaywallMessage.visibility = View.GONE
        matchesBinding.homeAccountHoldMessage.visibility = View.GONE
        matchesBinding.homeTransferMessage.visibility = View.GONE
    }else{
        matchesBinding.homeBasicMessage.visibility = View.GONE
        matchesBinding.homeAccountHoldMessage.visibility = View.GONE
        matchesBinding.homeTransferMessage.visibility = View.GONE
        matchesBinding.homePaywallMessage.visibility = View.VISIBLE
        Log.d("King", "insideelsesubbed$subbed")
    }
}

编辑:对不起。刚刚意识到你在 Kotlin 中的写作,我正在用 Java 做我的例子。


推荐阅读