美文网首页
百度地图 Fragment之间切换黑屏现象解决方案

百度地图 Fragment之间切换黑屏现象解决方案

作者: 杰奎琳子 | 来源:发表于2020-06-12 11:38 被阅读0次

    用过百度地图的人多很忧伤,各种bug, 已无力吐槽,最无语的可能就是会出现黑屏现象,比如一个Activity包含三个Fragment, 其中一个Fragment嵌套MapView使用,在切换这三个Fragment时会出现明显的黑屏,这个问题出现很久了,很早的SDK版本就存在,现在最新的SDK版本依然存在这个问题,解决方案如下:

    问题分析:百度地图切换界面出现黑屏原因是地图退出释放内存时渲染出现bug导致,因为是百度地图本身内部bug,所以我们无法从本质上去修复这个bug, 但是我们bug的出现黑屏现象隐藏起来,即:将地图的释放过程放入后台进行,从而避免黑屏的出现。

    1,在使用MapView的Fragment的onResume/onPause方法中手动调用设置view是否可见,具体如下:

    @Override 

    protected void OnPause(){ 

        mMapView.setVisibility(View.INVISIBLE); 

        mMapView.onPause(); 

        super.onPause(); 

    }

    进入页面时

    @Override 

    protected void onResume(){ 

            mMapView.setVisibility(View.VISIBLE); 

            mMapView.onResume(); 

            super.onResume(); 

    }

    2, Activity对应XML布局中单独使用一个View来替换嵌套有MapView的Fragment,需要显示该Fragment 时,设置该View为可见,不使用时设置为不可见。

     <FrameLayout

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:orientation="vertical" >

            <FrameLayout

                android:id="@+id/mapFrameLayout"

                android:layout_width="match_parent"

                android:layout_height="match_parent" >

            </FrameLayout>

            <FrameLayout

                android:id="@+id/otherFrameLayout"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                android:visibility="invisible" >

            </FrameLayout>

        </FrameLayout>

    3,从地图界面切换只其他界面时,手动隐藏地图界面,并在后台释放内存,完整代码如下。

    import android.os.Bundle;

    import android.support.v4.app.Fragment;

    import android.support.v4.app.FragmentActivity;

    import android.support.v4.app.FragmentManager;

    import android.support.v4.app.FragmentTransaction;

    import android.view.View;

    import android.widget.FrameLayout;

    public class MainActivity extends FragmentActivity{

    FragmentManager manager;

    FrameLayout mapFrameLayout;

    FrameLayout otherFrameLayout;

    @Override

    protected void onCreate(Bundle arg0) {

    super.onCreate(arg0);

    setContentView(R.layout.activity_main);

    mapFrameLayout = (FrameLayout)findViewById(R.id.mapFrameLayout);

    otherFrameLayout = (FrameLayout)findViewById(R.id.otherFrameLayout);

    BaiduMapFragment mBaiduMapFragment = new BaiduMapFragment();

    manager = getSupportFragmentManager();

    manager.beginTransaction().add(R.id.mapFrameLayout, mBaiduMapFragment, "map_fragment").commit();

    }

    public void toMapFragment(View v){

    mapFrameLayout.setVisibility(View.VISIBLE);

    otherFrameLayout.setVisibility(View.INVISIBLE);

    BaiduMapFragment mBaiduMapFragment = new BaiduMapFragment();

    manager.beginTransaction().replace(R.id.mapFrameLayout, mBaiduMapFragment, "map_fragment").commit();

    }

    public void toOtherFragment(View v){

    mapFrameLayout.setVisibility(View.INVISIBLE);

    otherFrameLayout.setVisibility(View.VISIBLE);

    OtherFragment otherFragment = new OtherFragment();

    FragmentTransaction mTransaction = manager.beginTransaction();

    mTransaction.replace(R.id.otherFrameLayout, otherFragment, "other");

    Fragment fragment = manager.findFragmentByTag("map_fragment");

    if(fragment != null){

    mTransaction.remove(fragment); //释放百度地图 Fragment

    }

    mTransaction.commit();

    }

    }

    相关文章

      网友评论

          本文标题:百度地图 Fragment之间切换黑屏现象解决方案

          本文链接:https://www.haomeiwen.com/subject/kjxgtktx.html