问题
我正在使用BottomNavigationView
来自我的一项活动的 Android 设计支持库,以及每个导航项的片段。
每次我在栏上选择一个项目时,我都会执行一个片段事务,如下面的代码片段(为了简洁起见,删除了代码的某些部分):
private var fragmentToSet: Fragment? = null
private val onNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
fragmentToSet = when (item.itemId) {
// Choose fragment based on selection
// ...
}
// ...
supportFragmentManager.beginTransaction()
.replace(R.id.container, fragmentToSet)
.commit()
}
问题是......底部栏动画变得超级滞后,并且只有在片段完全加载并显示在屏幕上后才完成。
这个问题不完全是新的 https://stackoverflow.com/questions/17491557/drawerlayouts-item-click-when-is-the-right-time-to-replace-fragment因为使用导航菜单时也可能发生这种情况,但至少可以通过使用DrawerLayout.DrawerListener
并且仅在抽屉关闭后才进行实际的 Fragment 事务。
到目前为止我尝试过的
我尝试“缓存”片段,保存它们的引用以避免每次都重新创建对象(例如MyFragment.newInstance()
),但这没有用。
我还尝试使用处理程序,这有点解决了问题,但它可能会导致我出现异常在某些情况下 https://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html。像下面的代码片段一样:
handler.postDelayed({changeFragment(fragmentToSet!!)}, 200)
有没有一种方法可以在不使用处理程序(或其他异步调用)的情况下解决这个问题,类似于这个解决方案 https://stackoverflow.com/a/17492040/4070469使用导航菜单时?