我正在将我的应用程序更新为导航架构组件,我发现它在替换导航抽屉中可见的片段时存在延迟,无法顺利关闭。
直到现在,我一直在遵循这种方法:
https://vikrammnit.wordpress.com/2016/03/28/facing-navigation-drawer-item-onclick-lag/
所以我在onDrawerCloked
中导航而不是在onNavigationItemSelec
中导航以避免故障。
这是一个非常常见的问题,但它又回来了。使用导航组件时,它又变慢了,我看不到在DrawerClosed中实现它的方法。
这些是导航组件之前的一些旧答案
Android上的导航抽屉延迟
抽屉布局的项目点击-什么时候是替换片段的正确时间?
非常感谢你。
避免更改NavigationItemSelected上的片段/活动时引起的延迟-Android
导航抽屉是应用程序中最常见的选项,当我们有超过五个选项时,我们会进入导航菜单。
我在许多应用程序中看到,当我们从导航菜单中更改选项时,我们观察到它滞后,StackOverflow上的一些人建议使用Handler,如下代码:
private void openDrawerActivity(final Class className) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
ProjectUtils.genericIntent(NewDrawer.this, className, null, false);
}
}, 200);
}
但在上面的代码中,它仍然不平滑
有关解决方案的更多详细信息,请浏览https://android.jlelse.eu/avoid-the-lag-caused-while-changing-fragment-activity-onnavigationitemselected-android-28bcb2528ad8.这真的很有用。
希望你在里面找到更好的解决方案!
我在写这个答案的时候正在解决这个问题。经过一些测试,我得出结论,我在创建代码后立即执行的代码片段(如初始化RecyclerView适配器并用数据填充它,或配置UI)导致抽屉延迟,因为所有这些都是同时发生的。
现在我得到的最好的想法类似于一些依赖于onDrawerCloked
的较旧的解决方案。我们延迟片段中代码的执行,直到抽屉关闭。在抽屉关闭之前,片段的布局将变得可见,因此它看起来仍然快速且响应迅速。
注意,我还使用了导航组件。
首先,我们将创建一个接口并实现它的片段。
interface StartFragmentListener {
fun configureFragment()
}
在活动设置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()
}
})
}
要通知片段抽屉已关闭,并且它可以执行导致延迟的操作:
private fun notifyDrawerClosed(){
val currentFragment =
supportFragmentManager.findFragmentById(R.id.psMainNavHostFragment)
?.childFragmentManager?.primaryNavigationFragment
if(currentFragment is StartFragmentListenr && currentFragment != null)
currentFragment.configureFragment()
}
如果您没有从抽屉导航到片段(例如按下后退按钮),您还需要通知片段执行其操作。我们将实现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)
}
在片段中:
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()
}
}
}
可以使用共享视图模型实现类似的解决方案。
实际上,我正在我的应用程序中使用新的架构组件,并且我已经设置了导航组件。我有一个导航抽屉,我想用它。我已经设置好了,但我面临一些问题: 1-抽屉不会自动关闭。菜单正常工作并导航到正确的位置,但导航后不会关闭。我必须添加一个目的地ChangedListener才能自己关闭它。 在代码实验室里,抽屉自动关闭,我真的不明白为什么。 2-向上按钮打开抽屉。当我导航到非顶级片段时,菜单图标变为向上箭头,但当
有人能告诉我如何创建活动到这个主要活动,导航抽屉将看到在所有他们?我需要使用这个特定的MainActivity代码。我不需要使用碎片,只要3个简单的活动将添加到这个抽屉。 NavDrawer布局:
我有一个导航抽屉的问题,它太慢了,我正在寻找的解决方案是关闭抽屉,然后显示活动,但它不工作,当然我错过了一些东西。
我所拥有的 我有一个导航抽屉和一个浏览寻呼机。查看寻呼机有5个片段。我在视图页面的每个片段中放置了一个图像视图。 问题 我看到,每当我将图像视图放在片段中并尝试打开导航抽屉时,动画都非常缓慢和滞后。即使我试着把它关上,它也非常滞后。 但是,如果我删除ImageView,则导航像往常一样平滑。 我需要放置ImageView,因为它非常重要。请给出一些解决方案,如我如何打开导航抽屉
问题内容: 我有一个导航图,该导航图将此片段用作主活动XML中的主页。 我有一个带有菜单的Drawer布局,单击导航抽屉按钮时,我无法设法使导航正常工作(它可以从主要片段工作,但是当我单击Drawer按钮时,不能工作),如果我使用的是旧方法使用:对导航抽屉编程,我的navcontroller丢失了!!我得到类似的错误 navcontroller无法识别目标片段,因为即使不是这种情况,控制器也会看到
我有一个导航图,它在主活动XML中使用这个片段作为主页。 我有一个带菜单的抽屉布局,当我点击抽屉菜单按钮时,我无法使导航工作(它从主片段工作,但当我点击抽屉按钮时就不工作),如果我使用旧的方式来编程抽屉菜单: