1
votes

Comment réparer l'écran noir lors du remplacement de SupportMapFragment

Je crée une application simple en utilisant Mapbox (en utilisant mapbox-android-sdk: 7.1.0) dans un fragment.

J'ai une activité qui est composée d'un FrameLayout (contenant les fragments) et d'un bouton.

Au début, le Fragment1 (contenant la carte) est affiché dans le FrameLayout. Lorsque l'utilisateur clique sur le bouton, le Fragment1 est remplacé par le Fragment2 (contenant un TextView).

Pendant la transition, il y a un petit écran noir.

Quand j'utilise Mapbox dans une activité qui ne me pose aucun problème, cela semble se produire lorsque la méthode onDestroyView () est appelée.

MainActivity.java:

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


0 commentaires

3 Réponses :


1
votes

Il s'agit d'un problème connu lié au comportement de MapFragment: https: // github .com / mapbox / mapbox-gl-native / issues / 9570 . Selon le ticket, il existe actuellement deux façons de résoudre ce problème dans votre application.

Soit :

  1. Utilisez une image bitmap de la carte dans une ImageView lors de la transition au lieu d'une MapView . Vous pouvez ensuite rendre MapView visible dans le cadre du rappel OnMapReady dans votre activité.

Ou :

  1. Utilisez plutôt une implémentation TextureView . Cela peut être activé via Attributs MapboxMapOptions ou .xml . Vous devez également garder à l'esprit que cette solution peut entraîner des problèmes de performances ultérieurement.

0 commentaires

0
votes

J'ai essayé la première solution proposée par @riastrad mais je n'ai pas trouvé comment créer un bitmap de mapView (j'avais toujours un écran blanc avec le logo mapbox en bas).

Quoi qu'il en soit, j'ai essayé de utilisez setAlpha pour changer l'opacité de la mapView, et cela fonctionne. Je ne sais pas vraiment pourquoi cela ne fonctionne pas avec setVisibility(View.INVISIBLE).

Donc, avant de charger le Fragment2, j'appelle une méthode de Fragment1 pour définir le opacité de la mapView à 0.

MainActivity.java

public void transition(){
    mapView.setAlpha(0f);
}

Fragment1.java

button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if(currentFragment instanceof Fragment1){
            // Set the opacity of the mapView to 0
            ((Fragment1) currentFragment).transition();
            // Load Fragment2 containing a TextView
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fragment2()).addToBackStack(null).commit();
        }else {
            getSupportFragmentManager().popBackStack();
        }
    }
});

p >


0 commentaires

1
votes

L'utilisation de cette application d'attributs: mapbox_renderTextureMode = "true" lors du chargement de mapview à l'intérieur du fragment a fait l'affaire pour moi.


0 commentaires