首页 > 解决方案 > 有没有办法在方向改变期间不丢失碎片的视图模型?

问题描述

我正在遵循 MVVM 架构,并且我有一个附加到其父活动的片段。在方向更改期间,我的片段丢失了它的视图模型实例并正在创建一个新实例。我怎样才能解决这个问题?这是我的活动。

class TestingActivity : AppCompatActivity() {

     private lateinit var loginViewModel: LoginPageViewModel

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

        loginViewModel=ViewModelProvider(this).get(LoginPageViewModel::class.java)

        loginViewModel.getApiTokenRest(20234561, "ladevi31")
        TempDataStorage.initializeSharedPreferences(this)
        supportFragmentManager.beginTransaction()
            .replace(R.id.container, PersonalInfFragment()).commit()

    }

}

这是我的示例片段,每次方向更改时都附加到活动


class PersonalInfFragment : Fragment(R.layout.personal_information) {

    private lateinit var progressBar: ProgressBar
    private lateinit var linearContainer: LinearLayout
    private lateinit var showLinearLayout: LinearLayout
    private lateinit var personalViewModel: InformationViewModel
    private lateinit var myOnBackPressed: MyOnBackPressed
    private lateinit var tool_bar: Toolbar
    private val TAG = "PersonalInfFragment"


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initProperties(view)
        initToolBar()
        initObservingPersonalInformation()
        initBackButton()
        Log.i(TAG, "onViewCreated: ${personalViewModel.hashCode()}")
    }

    private fun initObservingPersonalInformation() {
        personalViewModel.returnPersonalInformation().observe(this) {
            if (it != null) {
                progressBar.visibility = View.GONE
                showLinearLayout.visibility = View.VISIBLE
                for (k in PersonalInformation::class.memberProperties) {
                    val text = TextView(requireActivity())
                    text.setLayoutParams(
                        LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.MATCH_PARENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT
                        )
                    )
                    text.text = "${k.name}:${k.get(it)}"
                    Log.i(TAG, "onViewCreated: ${text.text}")
                    text.textSize = 20.0f
                    linearContainer.addView(text)
                    Log.i(TAG, "onViewCreated: ${TempDataStorage.getCurUser()?.urlToken}")
                }
            }
        }
    }

    private fun initProperties(view: View) {
        progressBar = view.findViewById(R.id.progress_bar)
        linearContainer = view.findViewById(R.id.parent_linear)
        showLinearLayout = view.findViewById(R.id.show_linear)
        personalViewModel = ViewModelProvider(this).get(InformationViewModel::class.java)
        personalViewModel.startRequesting()
        progressBar.visibility = View.VISIBLE
        showLinearLayout.visibility = View.GONE
        tool_bar = view.findViewById(R.id.tool_bar)
        tool_bar.title = ""

        Log.i(TAG, "initProperties PersonalFragment: ${personalViewModel.hashCode()}")

    }
}

标签: javaandroidkotlin

解决方案


这不应该发生

ViewModel 类旨在以生命周期意识的方式存储和管理与 UI 相关的数据。ViewModel 类允许数据在配置更改(例如screen rotations.

尝试不要每次都初始化 viewModel

if(!this::viewmodel.isInitialized) // initialize

推荐阅读