侧边抽屉Navigation点击,在同一个activity中切换不同的fragment,fragment显示空白
你需要注意这两两句代码的顺序
removeBeforeFragments();
transaction = manager.beginTransaction();
你注意到,这两句代码正确的顺序使先remove操作,再获得transaction,我之前就把顺序搞反了,然年后我就试着先调试其他代码过后再回过头来解决这个问题,但是为什么会这样呢?
大概的意思就是:
remove里面有上一个transaction实例,上一个的transaction移除当前阶段的fragment使正确的,若是你把顺序搞反了,显示获得新得transaction实例再去执行remove操作,那是不行的,在加载的时候你已经使用新得transaction移除了接下来需要替换的fragment,那么你下次显示就是空白的.
我未完善的fragment xml布局,那个时候我觉得使加载正常,其实使么有加载出来,加载的仅仅是你在创建布局时的静态预览效果的布局,你若是再切换fragment的时候修改这个布局,也会是加载不出来的,可真是个障眼法
(个人理解,有误欢迎评论纠正,马上更改,谢谢!)
这个是正确的代码
/**
* navigation item 选择事件
*/
private void setNavigationItemClick() {
mNavigation.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
removeBeforeFragments();
transaction = manager.beginTransaction();
switch (menuItem.getItemId()){
case R.id.menu_bank_card:
{
Log.d(TAG, "onNavigationItemSelected: black");
transaction.replace(R.id.fl_main_fragment,Comment.fragmentMap.get(Comment.BANK_CARD_FRAGMENT));
Comment.currentFragment = Comment.BANK_CARD_FRAGMENT;
mTitle.setText(R.string.bankcard);
}break;
case R.id.menu_driver_card:
{
Log.d(TAG, "onNavigationItemSelected: driver");
transaction.replace(R.id.fl_main_fragment,Comment.fragmentMap.get(Comment.DRIVER_CARD_FRAGMENT));
Comment.currentFragment = Comment.DRIVER_CARD_FRAGMENT;
mTitle.setText(R.string.drivercard);
}break;
case R.id.menu_id_card:
{
Log.d(TAG, "onNavigationItemSelected: id");
transaction.replace(R.id.fl_main_fragment,Comment.fragmentMap.get(Comment.ID_CARD_FRAGMENT));
Comment.currentFragment = Comment.ID_CARD_FRAGMENT;
mTitle.setText(R.string.idcard);
}break;
case R.id.menu_post_card:
{
Log.d(TAG, "onNavigationItemSelected: post");
transaction.replace(R.id.fl_main_fragment,Comment.fragmentMap.get(Comment.POST_CARD_FRAGMENT));
Comment.currentFragment = Comment.POST_CARD_FRAGMENT;
mTitle.setText(R.string.postcard);
}break;
case R.id.menu_others:
{
Log.d(TAG, "onNavigationItemSelected: others");
transaction.replace(R.id.fl_main_fragment,Comment.fragmentMap.get(Comment.OTHER_CARD_FRAGMENT));
Comment.currentFragment = Comment.OTHER_CARD_FRAGMENT;
mTitle.setText(R.string.otherscard);
}break;
default:
break;
}
transaction.commit();
mDrawer.closeDrawers();
return true;
}
});
}
/**
* 移除先前得fragment
*/
private void removeBeforeFragments() {
for (String key: Comment.fragmentMap.keySet()) {
if (key != Comment.currentFragment) {
transaction.hide(Comment.fragmentMap.get(key));
transaction.remove(Comment.fragmentMap.get(key));
}
}
}