java - 有没有办法在方向改变期间不丢失碎片的视图模型?
问题描述
我正在遵循 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()}")
}
}
解决方案
这不应该发生
ViewModel 类旨在以生命周期意识的方式存储和管理与 UI 相关的数据。ViewModel 类允许数据在配置更改(例如
screen rotations
.
尝试不要每次都初始化 viewModel
if(!this::viewmodel.isInitialized) // initialize