在我们的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);
}
});