Android: restaurar fragmentos después de cambiar la orientación de la pantalla
Estoy empezando con fragmentos y estoy enfrentando un problema. Quiero restaurar mi fragmento después de una rotación de pantalla. Mi aplicación se ve así: en el paisaje tengo un botón en el área de la izquierda, que actualiza una etiqueta en el área de la derecha. Si en el modo de retrato, estoy navegando a una nueva actividad. Sin embargo, quiero mantener el estado del fragmento después de girar. El código se ve así:
Fragmento de área izquierda:
- Alternativa para el onResume () durante la conmutación de fragmentos
- Solución para el error de Android relacionado con setRetainInstance (true)
- Funcionamiento del gestor de fragmentos
- Señal fatal 11 (SIGSEGV) en 0x00000000 (código = 1), hilo 27830 (ple.myfragexample) - sólo en Android 4.1.2
- La animación de fragmento de ocultación no se reproduce
public class ListFragment extends Fragment implements OnClickListener { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_list, container, false); Button button = (Button) view.findViewById(R.id.button1); button.setOnClickListener(this); return view; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: updateDetail(); break; } } public void updateDetail() { String newTime = String.valueOf(System.currentTimeMillis()); DetailFragment fragment = (DetailFragment) getFragmentManager() .findFragmentById(R.id.detailFragment); if (fragment != null && fragment.isInLayout()) { fragment.setText(newTime); } else { Intent intent = new Intent(getActivity().getApplicationContext(), DetailActivity.class); intent.putExtra("value", newTime); startActivity(intent); } }
}
Actividad del área derecha:
public class DetailActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { finish(); return; } if (savedInstanceState == null) { setContentView(R.layout.activity_detail); Bundle extras = getIntent().getExtras(); if (extras != null) { String s = extras.getString("value"); TextView view = (TextView) findViewById(R.id.detailsText); view.setText(s); } } }
}
Fragmento del área derecha:
public class DetailFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater .inflate(R.layout.fragment_detail, container, false); return view; } public void setText(String item) { TextView view = (TextView) getView().findViewById(R.id.detailsText); view.setText(item); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); FragmentManager fm = getFragmentManager(); DetailFragment fragment = (DetailFragment)fm.findFragmentById(R.id.detailFragment); if (fragment == null) { fragment = new DetailFragment(); fragment.setTargetFragment(this, 0); fm.beginTransaction().add(R.id.detailFragment, fragment).commit(); } }
}
¿Qué puedo estar haciendo mal?
- Android InstantiationException con fragmento (es público)
- Android FragmentTabHost: No se conoce ninguna pestaña null
- Fragmentos lentos Android TabHost lento
- Llamar a un método Fragment de una actividad principal
- Uso de RoboFragment con FragmentManager
- ¿Hay una manera de establecer android: windowSoftInputMode por Fragment?
- Error al eliminar el fragmento que contiene videoView en 4.0.4
- Cómo implementar mostrar y ocultar fragmento dentro de fragmento en android
Usted tiene algunas opciones que puede utilizar el Bundle en un par de métodos para guardar y restaurar el estado de los fragmentos.
O puede utilizar el método setRetainInstance :
onCreate(Bundle save) { super.onCreate(save); setRetainInstance(true); }
Tenga en cuenta que el método setRetainInstance no funciona para fragmentos en el backstack.
@Override public void onConfigurationChanged(Configuration newConfig) { int orientation = getResources().getConfiguration().orientation; switch (orientation) { case Configuration.ORIENTATION_LANDSCAPE: getSupportFragmentManager().beginTransaction().replace(R.id.detailFragment, new DetailFragment()).commitAllowingStateLoss(); getSupportFragmentManager().beginTransaction().remove(new DetailFragment()).commitAllowingStateLoss(); break; case Configuration.ORIENTATION_PORTRAIT: getSupportFragmentManager().beginTransaction().replace(R.id.detailFragment, new DetailFragment()).commitAllowingStateLoss(); getSupportFragmentManager().beginTransaction().remove(new DetailFragment()).commitAllowingStateLoss(); break; } super.onConfigurationChanged(newConfig); }
Usted puede comprobar en el onConfigurationChange
y asegurarse de que su estado de fragmento no se pierde haciendo un commitAllowingStateLoss
- Por qué mi icono de HomeAsUp desapareció después de usar la acción de búsqueda en la barra de acciones
- Obtener información de cargos inalámbricos