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
- Tener un
MapFragment
instanciado. - Dispare una transacción de fragmento desde el menú de opciones, reemplazando el fragmento de mapa con otro fragmento.
- 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;
}