爲了節約資源,現在很多 app 採用了 replace() 方法來實現碎片的切換,但是在這種情寬下,如果不講之前的碎片雅茹棧中,就無法避免之前碎片回隨之銷燬,所以我們採用 hide() 和 show() 方法來實現碎片的切換。
實現效果
效果圖項目地址--https://github.com/FishInWater-1999/android-SignInSystem
這裏不講廢話直接給出最佳方案
首先,定義四個成員
private Fragment mContent = new Fragment();// 記錄下當前碎片 由於替換
private Fragment mPerson;
private Fragment mRanking;
private Fragment mSummary;
private FragmentTransaction transaction;
其次,在 OnCreate() 方法中,對他們進行初始化
mPerson = new Personal();
mRanking = new Ranking();
mSummary = new Summary();
fragmentManager = getSupportFragmentManager();
mContent = mRanking;
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.fragment, mContent).commit();
navigation.setSelectedItemId(R.id.navigation_home);
最後,在按鈕點擊時調用
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
switchContent(mPerson);
return true;
case R.id.navigation_dashboard:
switchContent(mRanking);
return true;
case R.id.navigation_ranking:
switchContent(mSummary);
return true;
}
return false;
}
};
private void switchContent(Fragment to) {
if (mContent != to) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
if (!to.isAdded()) { // 判斷是否被add過
// 隱藏當前的fragment,將 下一個fragment 添加進去
transaction.hide(mContent).add(R.id.fragment, to).commit();
} else {
// 隱藏當前的fragment,顯示下一個fragment
transaction.hide(mContent).show(to).commit();
}
mContent = to;
}
}
完整代碼地址 -->
點擊跳轉-- https://github.com/FishInWater-1999/android-SignInSystem/blob/master/app/src/main/java/com/example/joker/signinsystem/activities/MainActivity.java