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.