我正在尝试使用Kotlin开发适用于Android手机的应用程序,但是我遇到了片段生命周期,操作模式和视图模型的问题
我有一个MainActivity,NavigationView和一个FrameLayout来显示我所有的片段。 MainActivity仅在此处支持片段导航。
activity_main
<FrameLayout
android:id="@+id/activity_main_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</LinearLayout>
<!-- 2 | NavigationView -->
<com.google.android.material.navigation.NavigationView
android:id="@+id/activity_main_nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/activity_main_nav_header"
app:menu="@menu/activity_main_menu_drawer" />
现在在我的MainActivity中,我显示第一个片段,让我们用这种方法将其称为FragmentA
val transaction : FragmentTransaction = supportFragmentManager.beginTransaction()
.replace(R.id.activity_main_frame_layout, fragment)
transaction.addToBackStack(name)
transaction.commit()
此FragmentA是具有多个TextView
的表单。
我有一个与FragmentA关联的SearchViewModel
tewtView之一将用户发送到另一个片段,让我们使用此方法将他称为FragmentB:
FragmentA
private fun startCategoryFragment() {
val searchCategoryFragment = SearchCategoryFragment.newInstance()
//val childragmentManager = getChildFragmentManager()
val transaction : FragmentTransaction = activity!!
.supportFragmentManager.beginTransaction()
.replace(R.id.activity_main_frame_layout, searchCategoryFragment)
transaction.addToBackStack(null)
transaction.commit()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mainSearchViewModel = ViewModelProviders.of(activity!!).get(MainSearchViewModel::class.java)
mainSearchViewModel.getSelectedCategories().observe(viewLifecycleOwner, Observer { categorieList ->
mCategoryInputText.text = categorieList.joinToString { it.name }
})
}
片段B用于在recyclerview中选择项目列表,因此当我单击某个项目时,会出现ActionMode
片段B
inner class ActionModeCallback : ActionMode.Callback {
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
return false
}
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
return true
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
return true
}
override fun onDestroyActionMode(mode: ActionMode?) {
Log.d("ActionmodeReceiver", "onDestroyActionMode Called")
catListAdapter?.clearSelected()
actionMode = null
}
}
很抱歉,冗长的解释,但是现在我认为您已经掌握了一切。这是问题所在。 这是片段B中我的验证按钮的代码
......
fabValidate.setOnClickListener {
searchViewModel.setSelectedCategories(catListAdapter.selectedValues)
closeFragment()
}
.......
private fun closeFragment(){
actionMode?.finish()
activity!!.supportFragmentManager.popBackStack()
}
问题在于: 当我单击我的验证按钮时,片段B被破坏了,但是片段A中的观察者却得到了emptyList。 如果我在片段B中注释此行
//actionMode?.finish()
我的列表不是空的,但是我的工具栏上仍然显示了我的操作模式。
我想我面临一个生命周期问题,即我的B片段被破坏了,但是我正在解决这个问题。