Я использую BottomNavigationView + Navigation, чтобы изменить показ фрагмента или скрыть. но есть проблема, что фрагмент будет действовать все жизненные методы каждый раз. Я хочу, чтобы фрагмент действовал только один раз жизненными методами, поэтому я пишу MainViewModle, он обрабатывает 5 представлений содержимого фрагмента. Ниже приведен мой код:
private lateinit var viewModel: MainViewModel
private var contentView: View? = null
private lateinit var rootView: View
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (contentView==null){
viewModel = ViewModelProvider(activity!!).get(MainViewModel::class.java)
}
contentView = viewModel.getMineView()
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
if (contentView == null) {
rootView = inflater.inflate(R.layout.fragment_mine, container,false)
return rootView
}
return contentView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
if (contentView == null) {
//init datas...
viewModel.setMineView(rootView)
}
}
class MainViewModel : ViewModel() {
//控制每个Fragment加载数据, 加载过数据后再切换tab不加载
private var friendContentView: View? = null
private var datingContentView: View? = null
private var dynamicContentView: View? = null
private var msgContentView: View? = null
private var mineContentView: View? = null
private lateinit var bottomView: BottomNavigationView
fun setBottomView(bottomView: BottomNavigationView) {
this.bottomView = bottomView
}
fun getBottomView(): BottomNavigationView {
return bottomView
}
fun setFriendView(view: View) {
friendContentView = view
}
fun getFriendView(): View? {
return friendContentView
}
fun setDatingView(view: View) {
datingContentView = view
}
fun getDatingView(): View? {
return datingContentView
}
fun setMsgView(view: View) {
msgContentView = view
}
fun getMsgView(): View? {
return msgContentView
}
fun setMineView(view: View) {
mineContentView = view
}
fun getMineView(): View? {
return mineContentView
}
fun setDynamicView(view: View) {
dynamicContentView = view
}
fun getDynamicView(): View? {
return dynamicContentView
}
}
сделать так, фрагмент будет действовать один раз методы жизни, но фрагмент будет мерцать, когда я щелкните нижнюю навигационную панель, чтобы изменить фрагмент, и когда я дважды щелкну на BottomNavigationView, приложение обработает sh. Журнал: у указанного потомка уже есть родитель. Сначала вы должны вызвать removeView () у родителя ребенка