我正在使用谷歌DrawerLayout.
单击某个项目后,抽屉将平稳关闭并Activity启动.将这些活动转变为Fragments 不是一种选择.因此,启动活动然后关闭抽屉也不是一种选择.关闭抽屉并同时启动活动将使关闭动画口吃.
鉴于我希望首先顺利关闭它,然后启动活动,我遇到了用户点击抽屉项目和他们看到他们想要去的活动之间的延迟问题.
这就是每个项目的点击监听器的样子.
final View.OnClickListener mainItemClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
mViewToLaunch = v;
mDrawerLayout.closeDrawers();
}
};
Run Code Online (Sandbox Code Playgroud)
我的活动也是DrawerListener,它的onDrawerClosed方法如下:
@Override
public synchronized void onDrawerClosed(final View view) {
if (mViewToLaunch != null) {
onDrawerItemSelection(mViewToLaunch);
mViewToLaunch = null;
}
}
Run Code Online (Sandbox Code Playgroud)
onDrawerItemSelection 刚刚启动五项活动之一.
我就没事onPause的DrawerActivity.
我正在检测它,从onClick调用的那一刻开始平均需要500-650ms,直到onDrawerClosed结束.
一旦抽屉关闭,在相应的活动开始之前,存在明显的滞后.
我意识到发生了一些事情:
结束动画发生,就在那里几毫秒(比方说300).
然后,抽屉在视觉上关闭和听众被解雇之间可能存在一些延迟.我试图通过查看DrawerLayout来源确切地弄清楚这有多少发生但尚未弄明白.
然后是启动的活动执行其启动生命周期方法所需的时间,包括onResume.我还没有对此进行检测,但估计大约200-300毫秒.
这似乎是一个问题,走错路是非常昂贵的,所以我想确保我完全理解它.
一个解决方案是跳过关闭动画,但我希望保持它.
如何尽可能减少过渡时间?
I am updating my app to Navigation Architecture Components and I see that it has a lag replacing fragments which is visible in the NavigationDrawer that does not close smoothly.
Until now, I was following this approach:
https://vikrammnit.wordpress.com/2016/03/28/facing-navigation-drawer-item-onclick-lag/
所以我导航onDrawerClosed而不是进入onNavigationItemSelected以避免故障。
这是一个非常普遍的问题,但它又回来了。使用导航组件,它再次滞后,我没有看到在onDrawerClosed.
这些是导航组件之前的一些旧答案
DrawerLayout 的项目点击 - 什么时候更换片段合适?
非常感谢。
android navigation-drawer navigationview android-architecture-navigation
我遇到了导航抽屉的问题,它太慢了,我正在寻找的解决方案是首先关闭抽屉然后显示活动,但它不起作用,当然我错过了一些东西.
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int posicao, long id) {
setLastPosition(posicao);
setFragmentList(lastPosition);
layoutDrawer.closeDrawer(linearDrawer);
}
}
private OnClickListener userOnClick = new OnClickListener() {
@Override
public void onClick(View v) {
layoutDrawer.closeDrawer(linearDrawer);
}
};
private void setFragmentList(int posicao) {
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = new FragmentViagens();
switch (posicao) {
case 0:
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
break;
case 1:
fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentPedidos()).commit();
break;
case 2:
fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentClientes()).commit();
break;
}
navigationAdapter.setChecked(posicao, true);
setTitleFragments(lastPosition);
navigationAdapter.resetarCheck();
layoutDrawer.closeDrawer(linearDrawer); …Run Code Online (Sandbox Code Playgroud) 实现并按预期工作,因此确实没有值得发布的代码,只是想知道是否有人有加快抽屉打开和关闭所需时间的经验?例如,YouTube应用程序要快得多!
我BottomNavigationView在自己的一个活动中使用了Android设计支持库中的,同时在每个导航项中都使用了Fragments。
每次我在栏上选择一个项目时,都会执行一个片段事务,如下面的代码片段(为简洁起见,删除了部分代码):
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()
}
Run Code Online (Sandbox Code Playgroud)
问题是...底部小节动画变得超级滞后,并且仅在片段完全加载并显示在屏幕上之后才能完成。
这个问题并不完全是新问题,因为在使用“导航菜单”时也可能发生,但是至少可以通过使用来解决它,DrawerLayout.DrawerListener并且只有在抽屉关闭后才进行实际的Fragment事务。
我试图“缓存”片段,保留它们的引用以避免每次都重新创建对象(例如MyFragment.newInstance()),但这是行不通的。
我也尝试使用处理程序,这可以解决问题,但是在某些情况下可能会导致异常。类似于以下代码段:
handler.postDelayed({changeFragment(fragmentToSet!!)}, 200)
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以解决此问题,而无需使用处理程序(或其他异步调用),方法与使用导航菜单时的解决方案类似?
android android-fragments kotlin material-design bottomnavigationview