Open bingoogolapple opened 7 years ago
用这种。每次切换都会走完整的声明周期方法,但是前后台切换时只会走当前 Fragment 的 onStart 和 onPause 方法
@Override
protected void setListener() {
RxRadioGroup.checkedChanges(mBinding.rgLocationChooseType).subscribe(integer -> {
if (mBinding.rgLocationChooseType.getCheckedRadioButtonId() == R.id.rb_location_choose_map) {
if (mLocationChooseMapFragment == null) {
mLocationChooseMapFragment = new LocationChooseMapFragment();
}
changeFragment(mLocationChooseMapFragment);
} else if (mBinding.rgLocationChooseType.getCheckedRadioButtonId() == R.id.rb_location_choose_history) {
if (mLocationChooseHistoryFragment == null) {
mLocationChooseHistoryFragment = new LocationChooseHistoryFragment();
}
changeFragment(mLocationChooseHistoryFragment);
} else {
if (mLocationChooseOtherFragment == null) {
mLocationChooseOtherFragment = new LocationChooseOtherFragment();
}
changeFragment(mLocationChooseOtherFragment);
}
});
}
private void changeFragment(Fragment fragment) {
// 会走前一个 Fragment 的 onDestroy 方法。每次切换都会走完整的声明周期方法,但是前后台切换时只会走当前 Fragment 的 onStart 和 onPause 方法
getSupportFragmentManager().beginTransaction().replace(R.id.fl_location_choose_content, fragment).commit();
}
需要添加返回栈的情况
public void putBackFragment(Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fl_location_choose_content, fragment);
// 如果这里不添加这一句会走前一个 Fragment 的 onDestroy 方法
fragmentTransaction.addToBackStack(fragment.getClass().getName());
fragmentTransaction.commit();
}
@Override
public void onBackPressed() {
if (getSupportFragmentManager().popBackStackImmediate()) {
return;
} else {
super.onBackPressed();
}
}