【开发笔记】高德地图在fragment使用时切换时会黑屏

背景:fragment,使用FrameLayout作为容器,切换fragment的时候使用fragmentTransaction.replace(int, fragment); 切换的时候黑屏,看样子是高德的bug,mapView在fragment的摧毁的时候释放时间太久,导致ui部分黑屏了。

解决方案:

1.使用两个FrameLayout

在activity里使用两个FrameLayout容器,一个叫地图FrameLayout,一个叫普通FrameLayout,有map view的放到地图FrameLayout里面去,统一管理。
每次切换的时候先fragment所在的FrameLayout容器先gone掉,再去remove 掉具体的fragment。这时,耗时的ui操作在后台进行,所以就不会看到黑屏的存在,但是,还是有点耗时的时间存在,导致屏幕会有点卡顿。
结果是良好的,fragment的生命周期不变。

BaseFragment mLastBaseFragment;
// 根据fragment实例去切换activity里的fragment
public void changeFragment(BaseFragment fragment) {
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    if (mLastBaseFragment != fragment) {
        if (fragment instanceof MapFragment) { // 区别是不是地图fragment单独处理
            frameLayout.setVisibility(View.GONE);
            mapFrameLayout.setVisibility(View.VISIBLE);
            fragmentTransaction.replace(R.id.mapFrameLayout, fragment);
        } else {
            frameLayout.setVisibility(View.VISIBLE);
            mapFrameLayout.setVisibility(View.GONE);
            fragmentTransaction.replace(R.id.frameLayout, fragment);
        }
        if (mLastBaseFragment != null) {
            fragmentTransaction.remove(mLastBaseFragment);
        }
        fragmentTransaction.commit();
        mLastBaseFragment = fragment;
    }
}

2.将fragment的切换从replace环城show和hide

使用show和hide,黑屏不见了,原理就是这时fragment不会每次都被重新创建了。但是fragment的生命周期就乱了,具体表现为没有onResume和onPause,这时使用手动的方式模拟这两个fragment.setUserVisibleHint(true), 实际上setUserVisibleHint在fragment与view pager共用的时候才会被调用。

FragmentTransaction fragmentTransaction = fm.beginTransaction();
Fragment fragment = fm.findFragmentByTag(type + "");
if (mCurFragment != null) {
    fragmentTransaction.hide(mCurFragment);
    mCurFragment.setUserVisibleHint(false);
}
if (fragment == null) {
    fragmentTransaction.add(R.id.frameLayout, list.get(type), type + "");
} else {
    fragmentTransaction.show(fragment);
}
fragment.setUserVisibleHint(true);
mCurFragment = list.get(type);
fragmentTransaction.commit();