studio retroceder boton atras android android-fragments mapfragment

retroceder - android studio boton atras



MapFragment: mal rendimiento después de usar el botón Atrás (1)

Tengo un problema de rendimiento cuando uso MapFragment junto con el menú de la barra de acciones.

El error surge cuando se cumplen tres condiciones

  1. Tener un MapFragment instanciado.
  2. Dispare una transacción de fragmento desde el menú de opciones, reemplazando el fragmento de mapa con otro fragmento.
  3. Presiona el botón Atrás y regresa al fragmento del mapa. El rendimiento ahora está notablemente degradado. La panorámica y el zoom son muy espasmódicos.

Abrir nuevamente el menú de opciones y descartarlo nuevamente soluciona el problema.

El comportamiento no surge cuando

  • Disparar el reemplazo del fragmento desde un botón de vista en lugar del menú de opciones.
  • Disparar el reemplazo de fragmento directamente en onCreate()
  • reemplazando el fragmento en blanco con MapFragment del menú de opciones
  • llamando a popBackStack desde el menú de opciones
  • utilizando un ListFragment en lugar de un MapView

Ejemplo de trabajo mínimo (requiere acceso a la API de Google Maps):

import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import com.google.android.gms.maps.MapFragment; public class MapFragmentBugActivity extends Activity { Fragment mMapFragment; String MAP = "Map"; String BLANK = "Blank"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_bug); mMapFragment = new MapFragment(); getFragmentManager().beginTransaction() .replace(R.id.main, mMapFragment) .commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(MAP); menu.add(BLANK); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { Fragment fragment; if (item.getTitle().equals(MAP)) { fragment = mMapFragment; } else { fragment = new Fragment(); } getFragmentManager() .beginTransaction() .replace(R.id.main, fragment) .addToBackStack(null) .commit(); return true; } }

Diseño de la actividad, nada especial

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />


La transacción de fragmento se realiza antes de que se cierre el menú de opciones, esto causa el comportamiento extraño.

En lugar de realizar directamente la transacción de fragmento, publíquelo en el Handler . Una vez que se cierra el menú de opciones, se realizará la transacción del fragmento.

Prueba esto :

@Override public boolean onOptionsItemSelected(MenuItem item) { final Fragment fragment; if (item.getTitle().equals(MAP)) { fragment = mMapFragment; } else { fragment = new Fragment(); } Handler handler = new Handler(); handler.post(new Runnable() { @Override public void run() { getFragmentManager() .beginTransaction() .replace(R.id.main, fragment) .addToBackStack(null) .commit(); } }); return true; }