本文共 1561 字,大约阅读时间需要 5 分钟。
在我们的app界面中,经常会有这样的布局:
mainActivity托管多个fragment,在navigationView的点击事件中处理fragment的切换逻辑,很简单也很实用。
一看到这样的逻辑,我们首先就会想到,fragment之间的关系不能是replace,这样的话每次切换都会销毁并创建新的实例,影响切换时的体验,所以我们用hide和show来隐藏/显示他们。
但不可避免的是,即便我们使用hide与show,fragment必然需要一个创建与初始化的过程,这个过程将发生在首次切换到某个fragment时,这样的话,会有明显的掉帧,如图:在仔细观察掉帧动画后发现,之所以我们可以发现掉帧,是因为它发生在drawer关闭的过程中。
drawer在半关闭状态时开始掉帧,然后到下一帧时已经是完全关闭状态,这中间漏掉的好几帧直接让我们感觉到卡顿。 所以我试着将这个创建过程延时到drawer关闭之后,这样的话,因为当前没有动画,是一个近乎静态的界面,掉帧也不会太明显,大概是这样的效果:说完了思路,具体实现就很简单了。
在NavigationView的点击事件中做一个标记,记录被点击的item; 为DrawerLayout添加监听,在onDrawerClosed中处理被点击item的相关事件;navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { //关闭drawer if(drawerLayout.isDrawerOpen(Gravity.LEFT)){ drawerLayout.closeDrawers(); } switch (item.getItemId()){ case R.id.navigation_csdn: selectedItem = Const.FRAGMENT_CSDN; break; case R.id.navigation_hukai: selectedItem = Const.FRAGMENT_HUKAI; break; //...... } return true; } });drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { @Override public void onDrawerClosed(View drawerView) { //在这里处理切换fragment的逻辑 switcher.switchFragment(selectedItem); } });