gpt4 book ai didi

android - BottomNavigationView 滞后于 fragment 事务

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:01:24 24 4
gpt4 key购买 nike

问题

我在我的一个 Activity 中使用来自 Android 设计支持库的 BottomNavigationView,以及每个导航项的 fragment 。

每次我在栏上选择一个项目时,我都会进行 fragment 交易,如下面的 fragment (为简洁起见,删除了部分代码):

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()
}

问题是...底部栏动画变得 super 滞后,只有在 fragment 完全加载并显示在屏幕上后才结束。

本期is not exactly new因为它也可能在使用导航菜单时发生,但至少可以通过使用 DrawerLayout.DrawerListener 来解决它,并且仅在抽屉关闭后才执行实际的 Fragment 事务。

到目前为止我尝试了什么

我尝试“缓存” fragment ,保留它们的引用以避免每次都重新创建对象(例如 MyFragment.newInstance()),但这没有用。

我也尝试使用处理程序,这有点解决了问题,但它可能会导致我出现异常 in some cases .类似于下面的代码 fragment :

handler.postDelayed({changeFragment(fragmentToSet!!)}, 200)

有没有一种方法可以在不使用处理程序(或其他异步调用)的情况下以类似于 this solution 的方式解决此问题?在使用导航菜单时?

最佳答案

我通过使用 fragment 管理器隐藏和显示 fragment 来处理这种情况。我写了一个示例代码来处理它,如下所示。

class MainActivity : BaseActivity() {

private val homeFragment = HomeFragment.newInstance()
private val categoryFragment = CategoryFragment.newInstance()
private val searchFragment = SearchFragment.newInstance()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
navigation.menu.findItem(R.id.navigation_home).isChecked = true

supportFragmentManager.beginTransaction()
.add(R.id.containerFrameLayout, homeFragment)
.add(R.id.containerFrameLayout, categoryFragment)
.add(R.id.containerFrameLayout, searchFragment)
.commit()
setTabStateFragment(TabState.HOME).commit()
}

override fun onBackPressed() {
if (supportFragmentManager.backStackEntryCount > 0 || !homeFragment.isHidden) {
super.onBackPressed()
} else {
setTabStateFragment(TabState.HOME).commit()
navigation.menu.findItem(R.id.navigation_home).isChecked = true
}
}

private fun setTabStateFragment(state: TabState): FragmentTransaction {
supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
val transaction = supportFragmentManager.beginTransaction()
transaction.setCustomAnimations(R.anim.fragment_enter, R.anim.fragment_exit)
when (state) {
TabState.HOME -> {
transaction.show(homeFragment)
transaction.hide(categoryFragment)
transaction.hide(searchFragment)
}
TabState.CATEGORY -> {
transaction.hide(homeFragment)
transaction.show(categoryFragment)
transaction.hide(searchFragment)
}
TabState.SEARCH -> {
transaction.hide(homeFragment)
transaction.hide(categoryFragment)
transaction.show(searchFragment)
}
}
return transaction
}

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_home -> {
setTabStateFragment(TabState.HOME).commit()
return@OnNavigationItemSelectedListener true
}
R.id.navigation_category -> {
setTabStateFragment(TabState.CATEGORY).commit()
return@OnNavigationItemSelectedListener true
}
R.id.navigation_search -> {
setTabStateFragment(TabState.SEARCH).commit()
return@OnNavigationItemSelectedListener true
}
}
false
}

internal enum class TabState {
HOME,
CATEGORY,
SEARCH,
}

}

关于android - BottomNavigationView 滞后于 fragment 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52172060/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com