onActivityCreated() 已弃用,我认为这导致我的保存联系人功能无法正常工作,但不知道如何修复它

问题描述 投票:0回答:2

我一直在为一个项目开发 Android 应用程序,并且必须制作一个基本上只能用作联系人应用程序的通信按钮。所以我遵循了一个关于如何制作它的教程,但是他使用了一些不推荐使用的库,包括很多生命周期。为了让“保存联系人”按钮在应用程序上起作用,他对“onActivityCreated”函数进行了覆盖。但是,onActivityCreated 已被弃用,我一直在寻找修复它的方法但无济于事。

下面的代码是我的 AddContactDialogFragment.kt 类,我试图在其中真正实现 addcontact,所以问题很可能在那里。你可以看到我在看到 onActivityCreated 被弃用后尝试过的注释掉的“onViewCreated”覆盖。

package com.example.mavhealth.ui

import android.content.Context
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.example.mavhealth.R
import com.example.mavhealth.data.Contact
import com.example.mavhealth.databinding.FragmentAddContactDialogBinding
import androidx.lifecycle.DefaultLifecycleObserver

class AddContactDialogFragment : DialogFragment(), DefaultLifecycleObserver {
    private var _binding: FragmentAddContactDialogBinding? = null
    private val binding get() = _binding!!
    private lateinit var viewModel: ContactViewModel

    override fun onCreate(savedInstanceState: Bundle?)
    {
        super<DialogFragment>.onCreate(savedInstanceState)
        setStyle(STYLE_NO_TITLE, android.R.style.Theme_DeviceDefault_Light_Dialog_MinWidth)
        activity?.lifecycle?.removeObserver(this)

        viewModel.result.observe(viewLifecycleOwner, Observer{
            val message = if (it == null) {
                getString(R.string.added_contact)
            }else{
                getString(R.string.error, it.message)
            }
            Toast.makeText(requireContext(),message,Toast.LENGTH_SHORT).show()
            dismiss()
        })
        binding.buttonAdd.setOnClickListener {
            val fullName = binding.editTextFullName.text.toString().trim()
            val contactNumber = binding.editTextContact.toString().trim()
            if(fullName.isEmpty())
            {
                binding.editTextFullName.error = "This is a required field"
                return@setOnClickListener
            }
            if(contactNumber.isEmpty())
            {
                binding.editTextContact.error = "This is a required field"
                return@setOnClickListener
            }
            val contact = Contact()
            contact.name = fullName
            contact.number = contactNumber
            viewModel.addContact(contact)
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
    {
        _binding = FragmentAddContactDialogBinding.inflate(inflater, container, false)
        viewModel = ViewModelProvider(this)[ContactViewModel::class.java]
        return binding.root
    }
/*
    override fun onViewCreated(view: View, savedInstanceState: Bundle?)
    {
        super.onViewCreated(view, savedInstanceState)
        viewModel.result.observe(viewLifecycleOwner, Observer{
            val message = if (it == null) {
                getString(R.string.added_contact)
            }else{
                getString(R.string.error, it.message)
            }
            Toast.makeText(requireContext(),message,Toast.LENGTH_SHORT).show()
            dismiss()
        })
        binding.buttonAdd.setOnClickListener {
            val fullName = binding.editTextFullName.text.toString().trim()
            val contactNumber = binding.editTextContact.toString().trim()
            if(fullName.isEmpty())
            {
                binding.editTextFullName.error = "This is a required field"
                return@setOnClickListener
            }
            if(contactNumber.isEmpty())
            {
                binding.editTextContact.error = "This is a required field"
                return@setOnClickListener
            }
            val contact = Contact()
            contact.name = fullName
            contact.number = contactNumber
            viewModel.addContact(contact)
        }
    }
*/

    override fun onAttach(context: Context)
    {
        super.onAttach(context)
        activity?.lifecycle?.addObserver(this)
    }

}

这个代码块是我的 ContactViewModel.kt 类,我在其中有一个 addContact 函数,所以这也可能是出错的地方。

package com.example.mavhealth.ui

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.mavhealth.data.Contact
import com.example.mavhealth.data.NODE_CONTACTS
import com.google.firebase.database.FirebaseDatabase

class ContactViewModel: ViewModel()
{
    private val dbContacts = FirebaseDatabase.getInstance().getReference(NODE_CONTACTS)
    private val _result = MutableLiveData<Exception?>()
    val result: LiveData<Exception?> get() = _result
    fun addContact(contact: Contact)
    {
        contact.id = dbContacts.push().key
        dbContacts.child(contact.id!!).setValue(contact).addOnCompleteListener{
            if(it.isSuccessful)
            {
                _result.value = null
            }
            else
            {
                _result.value = it.exception
            }
        }

    }
}

我尝试将“onActivityCreated”覆盖替换为“onViewCreated”,但这没有用。覆盖不起作用,或者我使保存联系人工作的代码不正确。之后,我看到一些帖子说要覆盖“onCreate”和“onAttach”,但是当我这样做时,不仅保存联系人不起作用,而且现在单击保存联系人会使我的应用程序崩溃。我不知道我是否做错了,或者正确的解决方案是否完全通过了我,但我将不胜感激任何帮助。

更新 1:我尝试使用注释掉的 onViewCreated 代码初始化 viewmodel,虽然它没有崩溃,但保存联系人仍然无效。这让我想知道我是否错误地设置了我的 firebase,因为它无法读/写。

java android kotlin android-fragments android-lifecycle
2个回答
0
投票
viewModel.result.observe(viewLifecycleOwner, Observer{
    val message = if (it == null) {
        getString(R.string.added_contact)
    }else{
        getString(R.string.error, it.message)
    }
    Toast.makeText(requireContext(),message,Toast.LENGTH_SHORT).show()
    dismiss()
})

这里必须初始化viewLifecycleOwner


0
投票

viewmodel 未初始化。 在你的代码中,viewmodel是在onCreatedView中初始化的,但是由于onCreate在生命周期中最先运行,所以出现了错误。 我认为默认创建它会更好,因为在创建视图模型时没有应用其他选项。

private val viewModel: ContactViewModel by viewModels() 
© www.soinside.com 2019 - 2024. All rights reserved.