gpt4 book ai didi

Android 导航组件在通过 NavigationDrawer 导航时有延迟

转载 作者:行者123 更新时间:2023-12-03 13:24:48 27 4
gpt4 key购买 nike

我正在将我的应用程序更新为导航架构组件,并且我看到它有一个延迟替换 fragment ,这些 fragment 在 N​​avigationDrawer 中可见,并且不能顺利关闭。

到目前为止,我一直在遵循这种方法:

https://vikrammnit.wordpress.com/2016/03/28/facing-navigation-drawer-item-onclick-lag/

所以我导航到 onDrawerClosed而不是在 onNavigationItemSelected以避免故障。

这是一个非常普遍的问题,但它又回来了。使用导航组件,它再次滞后,我看不到在 onDrawerClosed 中实现它的方法.

这些是导航组件之前的一些较旧的答案

Navigation Drawer lag on Android

DrawerLayout's item click - When is the right time to replace fragment?

非常感谢。

最佳答案

我在写这个答案时正在解决这个问题。经过一些测试,我得出结论,我在创建 fragment 后立即在 fragment 中执行的代码(例如初始化 RecyclerView 适配器并用数据填充它,或配置 UI)导致抽屉滞后,因为这一切同时发生。

现在我得到的最好的想法类似于一些依赖 onDrawerClosed 的旧解决方案。 .我们延迟 fragment 中代码的执行,直到抽屉关闭。在抽屉关闭之前, fragment 的布局将变得可见,因此它仍然看起来快速且响应迅速。

请注意,我也在使用导航组件。

首先,我们将创建一个接口(interface)并实现它的 fragment 。

interface StartFragmentListener {
fun configureFragment()
}

在 Activity 设置 DrawerListener 中,例如:
private fun configureDrawerStateListener(){
psMainNavDrawerLayout.addDrawerListener(object: DrawerLayout.DrawerListener{
override fun onDrawerStateChanged(newState: Int) {}
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}
override fun onDrawerOpened(drawerView: View) {}

override fun onDrawerClosed(drawerView: View) {
notifyDrawerClosed()
}

})
}

通知 fragment 抽屉已关闭并且它可以执行导致延迟的操作:
private fun notifyDrawerClosed(){
val currentFragment =
supportFragmentManager.findFragmentById(R.id.psMainNavHostFragment)
?.childFragmentManager?.primaryNavigationFragment

if(currentFragment is StartFragmentListenr && currentFragment != null)
currentFragment.configureFragment()

}

如果您没有从抽屉导航到 fragment (例如按下后退按钮),您还需要通知 fragment 做它的事情。我们将实现 FragmentLifecycleCallbacksListener:
private fun setupFragmentLifecycleCallbacksListener(){
supportFragmentManager.findFragmentById(R.id.psMainNavHostFragment)
?.childFragmentManager?.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {

override fun onFragmentActivityCreated(fm: FragmentManager, f: Fragment, savedInstanceState: Bundle?) {
super.onFragmentActivityCreated(fm, f, savedInstanceState)

if (!psMainNavDrawerLayout.isDrawerOpen(GravityCompat.START)) {
if (f is StartFragmentListener)
f.configureFragment()
}

}
}, true)
}

在 fragment 中:
class MyFragment: Fragment(), MyActivity.StartFragmentListener {
private var shouldConfigureUI = true
...

override fun onDetach() {
super.onDetach()
shouldConfigureUI = true
}

override fun configureFragment() {
if(shouldConfigureUI){
shouldConfigureUI = false
//do your things here, like configuring UI, getting data from VM etc...
configureUI()
}
}
}

可以使用共享 View 模型来实现类似的解决方案。

关于Android 导航组件在通过 NavigationDrawer 导航时有延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990621/

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