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