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); } }
3 Réponses :
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 :
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 :
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. 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.
public void transition(){ mapView.setAlpha(0f); }
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 >
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.