1.
BottomNavigationView navView = findViewById(R.id.nav_view);
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
//NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
navView.setItemIconTintList(null); // 设置 BottomNavigationView 图片没有颜色覆盖
NavigationUI.setupWithNavController(navView, navController);
2.获取Fragment对象
//clazz传入fragment类:如:HomeFragment.class
public Fragment getFragment(Class<?> clazz) {
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments.size() > 0) {
NavHostFragment navHostFragment = (NavHostFragment) fragments.get(0);
List<Fragment> childfragments = navHostFragment.getChildFragmentManager().getFragments();
if(childfragments.size() > 0){
for (int j = 0; j < childfragments.size(); j++) {
Fragment fragment = childfragments.get(j);
if(fragment.getClass().isAssignableFrom(clazz)){
Log.i(TAG, "HomeFragment: " + fragment);
return fragment;
}
}
}
}
return null;
}
3.在宿主Activity中的onActivityResult()方法中
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
getFragment(HomeFragment.class).onActivityResult(requestCode, resultCode, data);
}
这样就可以将在fragment中使用startActivityForResult()返回的值从Activity的onActivityResult()中传递会fragment
4.fragment切换保存数据,即fragment不重建
private Fragment startfragment;
@Override protected void onResume() { super.onResume(); homeFragment= (HomeFragment) getFragment(HomeFragment.class); notificationsFragment= (NotificationsFragment) getFragment(NotificationsFragment.class); dashboardFragment= (DashboardFragment) getFragment(DashboardFragment.class); //初始fragment startfragment=homeFragment; requestPermission(); }
navView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.navigation_home:
// navController.navigate(R.id.navigation_home);
if(homeFragment==null||!homeFragment.isAdded()){
homeFragment=new HomeFragment();
getSupportFragmentManager().getPrimaryNavigationFragment()
.getChildFragmentManager().beginTransaction()
.hide(startfragment)
.add(R.id.nav_host_fragment,homeFragment)
.commit();
}else {
getSupportFragmentManager().getPrimaryNavigationFragment()
.getChildFragmentManager()
.beginTransaction()
.hide(startfragment)
.show(homeFragment).commit();
}
startfragment=homeFragment;
break;
case R.id.navigation_dashboard:
//navController.navigate(R.id.navigation_dashboard);
if(dashboardFragment==null||!dashboardFragment.isAdded()){
dashboardFragment=new DashboardFragment();
getSupportFragmentManager().getPrimaryNavigationFragment()
.getChildFragmentManager().beginTransaction()
.hide(startfragment)
.add(R.id.nav_host_fragment,dashboardFragment)
.commit();
}else {
getSupportFragmentManager().getPrimaryNavigationFragment()
.getChildFragmentManager()
.beginTransaction()
.hide(startfragment)
.show(dashboardFragment).commit();
}
startfragment=dashboardFragment;
break;
case R.id.navigation_notifications:
// navController.navigate(R.id.navigation_notifications);
if(notificationsFragment==null||!notificationsFragment.isAdded()){
notificationsFragment=new NotificationsFragment();
getSupportFragmentManager().getPrimaryNavigationFragment()
.getChildFragmentManager().beginTransaction()
.hide(startfragment)
.add(R.id.nav_host_fragment,notificationsFragment)
.commit();
}else {
getSupportFragmentManager().getPrimaryNavigationFragment()
.getChildFragmentManager()
.beginTransaction()
.hide(startfragment)
.show(notificationsFragment).commit();
}
startfragment=notificationsFragment;
break;
}
return false;
}
});