Android 更换SupportMapFragment时如何修复黑屏

Android 更换SupportMapFragment时如何修复黑屏,android,android-fragments,mapbox,Android,Android Fragments,Mapbox,我正在片段中使用Mapbox(使用Mapbox android sdk:7.1.0)创建一个简单的应用程序 我有一个活动,它由一个FrameLayout(包含片段)和一个按钮组成 开始时,Fragment1(包含地图)显示在FrameLayout中。当用户单击按钮时,Fragment1被Fragment2(包含文本视图)替换 在过渡期间有一个短的黑屏 当我在活动中使用Mapbox时,我没有任何问题,它似乎是在调用onDestroyView()方法时发生的 MainActivity.java: p

我正在片段中使用Mapbox(使用Mapbox android sdk:7.1.0)创建一个简单的应用程序

我有一个活动,它由一个FrameLayout(包含片段)和一个按钮组成

开始时,Fragment1(包含地图)显示在FrameLayout中。当用户单击按钮时,Fragment1被Fragment2(包含文本视图)替换

在过渡期间有一个短的黑屏

当我在活动中使用Mapbox时,我没有任何问题,它似乎是在调用onDestroyView()方法时发生的

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Load Fragment1 containing the map
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment1()).commit();


        AppCompatButton button = findViewById(R.id.btn_changeFragment);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Load Fragment2 containing a TextView
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment2()).addToBackStack(null).commit();
            }
        });
    }
}
public class Fragment1 extends SupportMapFragment {
    private MapView mapView;

    public Fragment1(){}

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Mapbox.getInstance(getContext(), getString(R.string.mapbox_token));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_1, container, false);
        mapView = view.findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(@NonNull final MapboxMap mapboxMap) {
                mapboxMap.setStyle(Style.LIGHT, new Style.OnStyleLoaded() {
                    @Override
                    public void onStyleLoaded(@NonNull Style style) {
                        // Configure the map
                    }
                });
            }
        });

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        mapView.onStart();
    }

    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mapView.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }
}
Fragment1.java:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Load Fragment1 containing the map
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment1()).commit();


        AppCompatButton button = findViewById(R.id.btn_changeFragment);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Load Fragment2 containing a TextView
                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment2()).addToBackStack(null).commit();
            }
        });
    }
}
public class Fragment1 extends SupportMapFragment {
    private MapView mapView;

    public Fragment1(){}

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Mapbox.getInstance(getContext(), getString(R.string.mapbox_token));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_1, container, false);
        mapView = view.findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(@NonNull final MapboxMap mapboxMap) {
                mapboxMap.setStyle(Style.LIGHT, new Style.OnStyleLoaded() {
                    @Override
                    public void onStyleLoaded(@NonNull Style style) {
                        // Configure the map
                    }
                });
            }
        });

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        mapView.onStart();
    }

    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
        mapView.onStop();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mapView.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }
}

这是MapFragment行为的已知问题:。根据通知单,目前有两种可能的方法来解决应用程序中的此问题

任一

  • 转换时,在
    ImageView
    中使用贴图的位图,而不是
    MapView
    。然后,您可以使MapView作为活动中
    OnMapReady
    回调的一部分可见
  • 改用
    TextureView
    实现。这可以通过或
    .xml
    属性启用。您还应该记住,此解决方案可能会导致性能问题

  • 我尝试了@riastrad提出的第一个解决方案,但我没有找到如何制作mapView的位图(我总是有一个底部带有mapbox徽标的白色屏幕)

    不管怎样,我尝试使用
    setAlpha
    来更改地图视图的不透明度,它确实有效。我真的不知道为什么它不适用于
    setVisibility(View.INVISIBLE)

    因此,在加载Fragment2之前,我从Fragment1调用一个方法,将mapView的不透明度设置为0

    MainActivity.java Fragment1.java
    在片段中加载mapview时,使用这个属性app:mapbox\u renderTextureMode=“true”为我做到了这一点