android-fragments 如何观察片段外的LiveData

mznpcxlj  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(165)

我在一个片段中有一个TextView。使用LiveData,我可以更改片段中的文本。通过使用MainActivity(片段外)中的按钮,我试图更改TextView中的文本,但它不起作用。有人能帮助我吗?下面是我的代码:
这是具有按钮和片段的MainActivity

class MainActivity : AppCompatActivity() {
    var tg: ToneGenerator? = null
    private lateinit var btn: Button
    private lateinit var viewModel:ViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tg = ToneGenerator(AudioManager.STREAM_SYSTEM, 100)

        btn = findViewById(R.id.buttonTest1)

        viewModel = ViewModelProvider(this).get(ViewModel::class.java)

        btn.setOnClickListener {
            tg?.startTone(ToneGenerator.TONE_PROP_BEEP)
            viewModel.changeMLD()
        }
    }
}

这是具有TextView的片段

class Fragment : Fragment() {

    private lateinit var txt1: TextView
    public lateinit var viewModel:ViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        // Inflate the layout for this fragment
        val view: View = inflater.inflate(R.layout.fragment, container, false)

        txt1 = view.findViewById(R.id.txt1)

        viewModel = ViewModelProvider(this).get(ViewModel::class.java)

        viewModel.initiateMLD()

        viewModel.LD.observe(viewLifecycleOwner, Observer {
            txt1.setText("Count is "+it)
        })

        return view
    }

}

这是包含LiveData的ViewModel

class ViewModel : ViewModel(){
    private var clickCount:Int = 0

    private var MLD = MutableLiveData<Int>()
    var LD : LiveData<Int> = getMLD()             // observer watches this variable

    fun initiateMLD(){
        MLD.value = 5
        clickCount = 5
    }

    fun getMLD():MutableLiveData<Int>{
        return MLD
    }

    fun changeMLD(){
        clickCount+=2
        MLD.value = clickCount
    }
}
j1dl9f46

j1dl9f461#

fragment中,您已经使用fragment作为owner创建了viewModel

viewModel = ViewModelProvider(this).get(ViewModel::class.java)

然而,要与activity通信,您需要使用activity作为owner创建viewModel对象,这些对象称为sharedViewModels

ViewModelProvider(requireActivity()).get(ViewModel::class.java)

您可以在codelab教程中阅读更多关于SharedViewModel的信息。

d8tt03nd

d8tt03nd2#

您正在使用ViewModel的两个不同示例。ViewModelProvider为您的Activity和片段创建一个示例。这是因为它们都是viewModelStoreOwners。如果您希望在片段和Activity中使用ViewModel的同一个示例。它必须是Activity范围内的。您可以这样做

ViewModelProvider(requireActivity()).get(ViewModel::class.java)

相关问题