bingoogolapple / bingoogolapple.github.io

个人主页。同时也通过 Issues 记录学习笔记
http://www.bingoogolapple.cn
86 stars 22 forks source link

Fragment #140

Open bingoogolapple opened 7 years ago

bingoogolapple commented 7 years ago

不用这种,前后台切换时,每次都会走所有已添加过的 Fragment 的 onStart 和 onPause 方法

@Override
protected void setListener() {
    RxRadioGroup.checkedChanges(mBinding.rgLocationChooseType).subscribe(integer -> {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        Fragment newFragment = null;
        if (mBinding.rgLocationChooseType.getCheckedRadioButtonId() == R.id.rb_location_choose_map) {
            if (mLocationChooseMapFragment == null) {
                mLocationChooseMapFragment = new LocationChooseMapFragment();
                fragmentTransaction.add(R.id.fl_location_choose_content, mLocationChooseMapFragment);
            }
            newFragment = mLocationChooseMapFragment;
        } else if (mBinding.rgLocationChooseType.getCheckedRadioButtonId() == R.id.rb_location_choose_history) {
            if (mLocationChooseHistoryFragment == null) {
                mLocationChooseHistoryFragment = new LocationChooseHistoryFragment();
                fragmentTransaction.add(R.id.fl_location_choose_content, mLocationChooseHistoryFragment);
            }
            newFragment = mLocationChooseHistoryFragment;
        } else {
            if (mLocationChooseOtherFragment == null) {
                mLocationChooseOtherFragment = new LocationChooseOtherFragment();
                fragmentTransaction.add(R.id.fl_location_choose_content, mLocationChooseOtherFragment);
            }
            newFragment = mLocationChooseOtherFragment;
        }
        // 显示新的 fragment
        fragmentTransaction.show(newFragment);

        // 如果之前的 fragment 不为 null,则隐藏之前的 fragment
        if (mCurrentFragment != null) {
            fragmentTransaction.hide(mCurrentFragment);
        }

        mCurrentFragment = newFragment;

        fragmentTransaction.commit();
    });
}
bingoogolapple commented 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();
}
bingoogolapple commented 7 years ago

需要添加返回栈的情况

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();
    }
}