почему фрагмент мерцает? - PullRequest
0 голосов
/ 09 апреля 2020

Я использую 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 () у родителя ребенка

...