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:

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?

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

  • ¿Cómo puedo evitar que onCreateView () de un fragmento sea llamado?
  • ¿Cómo puedo mostrar un nuevo Fragmento dentro de una sola pestaña?
  • Android API TabActivity deprecation
  • IU de Tablet Android: fragmento de múltiples paneles o diseño lineal
  • Añadir vista a un fragmento dinámicamente en Android?
  • SwitchCompat en barra de acción, con fragmento
  • Gestión de transacciones de fragmentos en las que no desea perder datos para algunos fragmentos
  • Obtenga GoogleMap del fragmento de ViewPager
  • ¿Cuándo se llama onAttach durante el Fragment LifeCycle?
  • FragmentStatePagerAdapter no quita fragmentos si se eliminó el fragmento padre
  • Android: Fragmento del ciclo de vida en la rotación de la pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.