Does it only fall behind if you click the back button?
If this is a problem, try locking the back button or exit the application, try this code:
@Override public void onBackPressed(){ AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("You wanna leave the aplication?").setPositiveButton("Yes", dialogClickListener) .setNegativeButton("No", dialogClickListener).show(); }
or try this code to put a map fragment in another fragment (a nested map fragment), it worked for me a few weeks ago:
Java class:
public class Yourfragment extends Fragment { private MapView mMapView; private GoogleMap mMap; private Bundle mBundle; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View inflatedView = inflater.inflate(R.layout.map_fragment, container, false); try { MapsInitializer.initialize(getActivity()); } catch (GooglePlayServicesNotAvailableException e) { // TODO handle this situation } mMapView = (MapView) inflatedView.findViewById(R.id.map); mMapView.onCreate(mBundle); setUpMapIfNeeded(inflatedView); return inflatedView; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBundle = savedInstanceState; } private void setUpMapIfNeeded(View inflatedView) { if (mMap == null) { mMap = ((MapView) inflatedView.findViewById(R.id.map)).getMap(); if (mMap != null) { setUpMap(); } } } private void setUpMap() { mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); } @Override public void onResume() { super.onResume(); mMapView.onResume(); } @Override public void onPause() { super.onPause(); mMapView.onPause(); } @Override public void onDestroy() { mMapView.onDestroy(); super.onDestroy(); } }
XML:
<com.google.android.gms.maps.MapView android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" />
put this code in post execute:
View inflatedView = inflater.inflate(R.layout.map_fragment, container, false); try { MapsInitializer.initialize(getActivity()); } catch (GooglePlayServicesNotAvailableException e) { // TODO handle this situation } mMapView = (MapView) inflatedView.findViewById(R.id.map); mMapView.onCreate(mBundle); setUpMapIfNeeded(inflatedView); return inflatedView;
and call assynctask on oncreateview
Try the following:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //Call assyncTask } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBundle = savedInstanceState; } private void setUpMapIfNeeded(View inflatedView) { if (mMap == null) { mMap = ((MapView) inflatedView.findViewById(R.id.map)).getMap(); if (mMap != null) { setUpMap(); } } } private void setUpMap() { mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); } @Override public void onResume() { super.onResume(); mMapView.onResume(); } @Override public void onPause() { super.onPause(); mMapView.onPause(); } @Override public void onDestroy() { mMapView.onDestroy(); super.onDestroy(); } private class GetFlightsTask extends AsyncTask<Double, Void, String> { @Override protected void onPreExecute() { super.onPreExecute(); // if I remove the next line, everything gets fixed loadingFlightsSpinner.show(); } @Override protected String doInBackground(Double... params) { // some pretty long remote API call // (loading a JSON file from http://some.website.com/flights?...) // works fine String flightsJSON = loadJSON("flights?flyFrom=CZ&to=..."); } @Override protected void onPostExecute(String flightsJSON) { super.onPostExecute(flightsJSON); loadingFlightsSpinner.dismiss(); // here I do stuff with the JSON and then replace the fragment dohardwork() } public view dohardwork(){ View inflatedView = inflater.inflate(R.layout.map_fragment, container, false); try { MapsInitializer.initialize(getActivity()); } catch (GooglePlayServicesNotAvailableException e) { // TODO handle this situation } mMapView = (MapView) inflatedView.findViewById(R.id.map); mMapView.onCreate(mBundle); setUpMapIfNeeded(inflatedView); return inflatedView; }