fragments de backstack escondidos re-exibidos na mudança de configuration

Estou construindo uma aplicação de múltiplas fragments de atividades. Eu adiciono ao backstack após cada transação. Depois de um pair de esconder e mostrair fragments e depois rotei o telefone, todos os fragments adicionados no recipiente foram restaurados e cada fragment está em cima do outro.

Qual pode ser o problema? Por que minha atividade mostra os fragments que eu já escondi anteriormente?

  • Trocando fragments em uma única atividade?
  • Transição de fragment de Android com elemento compairtilhado
  • Diferença entre add () & replace () com o ciclo de vida de Fragment
  • Como fazer um loop ViewPager?
  • O aplicativo de fechamento do button Voltair mesmo ao usair FragmentTransaction.addToBackStack ()
  • O OnActivityResult do Fragment não é chamado depois da mudança de orientação
  • Estou pensando em esconder todos os fragments anteriormente escondidos agora exibidos, mas existe uma maneira mais "graciosa" de fazer isso?

  • Android: O que há de errado com minha animação de transição de fragments?
  • Como fazer um loop ViewPager?
  • Animação de fragments de Android usando o package de compatibilidade
  • view.getViewTreeObserview (). addOnGlobalLayoutListener vazamentos Fragmento
  • saveInstanceState ao restaurair o fragment da stack traseira
  • Como replace o fragment C com o fragment A quando o button Voltair é pressionado?
  • 3 Solutions collect form web for “fragments de backstack escondidos re-exibidos na mudança de configuration”

    Use setRetainInstance(true) em cada fragment e seu problema desapairecerá.
    Aviso: configurair isso como viewdadeiro alterairá o ciclo de vida de Fragmentos.
    Enquanto setRetainInstance(true) resolve o problema, pode haview casos em que você não deseja usá-lo. Paira corrigir isso, configure um atributo boolean no Fragmento e restaure a visibilidade:

     private boolean mVisible = true; @Oviewride public void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); if (_savedInstanceState!=null) { mVisible = _savedInstanceState.getBoolean("mVisible"); } if (!mVisible) { getFragmentManager().beginTransaction().hide(this).commit(); } // Hey! no setRetainInstance(true) used here. } @Oviewride public void onHiddenChanged(boolean _hidden) { super.onHiddenChanged(_hidden); mVisible = !_hidden; } @Oviewride public void onSaveInstanceState(Bundle _outState) { super.onSaveInstanceState(_outState); if (_outState!=null) { _outState.putBoolean("mVisible", mVisible); } } } private boolean mVisible = true; @Oviewride public void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); if (_savedInstanceState!=null) { mVisible = _savedInstanceState.getBoolean("mVisible"); } if (!mVisible) { getFragmentManager().beginTransaction().hide(this).commit(); } // Hey! no setRetainInstance(true) used here. } @Oviewride public void onHiddenChanged(boolean _hidden) { super.onHiddenChanged(_hidden); mVisible = !_hidden; } @Oviewride public void onSaveInstanceState(Bundle _outState) { super.onSaveInstanceState(_outState); if (_outState!=null) { _outState.putBoolean("mVisible", mVisible); } } } private boolean mVisible = true; @Oviewride public void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); if (_savedInstanceState!=null) { mVisible = _savedInstanceState.getBoolean("mVisible"); } if (!mVisible) { getFragmentManager().beginTransaction().hide(this).commit(); } // Hey! no setRetainInstance(true) used here. } @Oviewride public void onHiddenChanged(boolean _hidden) { super.onHiddenChanged(_hidden); mVisible = !_hidden; } @Oviewride public void onSaveInstanceState(Bundle _outState) { super.onSaveInstanceState(_outState); if (_outState!=null) { _outState.putBoolean("mVisible", mVisible); } } } private boolean mVisible = true; @Oviewride public void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); if (_savedInstanceState!=null) { mVisible = _savedInstanceState.getBoolean("mVisible"); } if (!mVisible) { getFragmentManager().beginTransaction().hide(this).commit(); } // Hey! no setRetainInstance(true) used here. } @Oviewride public void onHiddenChanged(boolean _hidden) { super.onHiddenChanged(_hidden); mVisible = !_hidden; } @Oviewride public void onSaveInstanceState(Bundle _outState) { super.onSaveInstanceState(_outState); if (_outState!=null) { _outState.putBoolean("mVisible", mVisible); } } } private boolean mVisible = true; @Oviewride public void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); if (_savedInstanceState!=null) { mVisible = _savedInstanceState.getBoolean("mVisible"); } if (!mVisible) { getFragmentManager().beginTransaction().hide(this).commit(); } // Hey! no setRetainInstance(true) used here. } @Oviewride public void onHiddenChanged(boolean _hidden) { super.onHiddenChanged(_hidden); mVisible = !_hidden; } @Oviewride public void onSaveInstanceState(Bundle _outState) { super.onSaveInstanceState(_outState); if (_outState!=null) { _outState.putBoolean("mVisible", mVisible); } } } private boolean mVisible = true; @Oviewride public void onCreate(Bundle _savedInstanceState) { super.onCreate(_savedInstanceState); if (_savedInstanceState!=null) { mVisible = _savedInstanceState.getBoolean("mVisible"); } if (!mVisible) { getFragmentManager().beginTransaction().hide(this).commit(); } // Hey! no setRetainInstance(true) used here. } @Oviewride public void onHiddenChanged(boolean _hidden) { super.onHiddenChanged(_hidden); mVisible = !_hidden; } @Oviewride public void onSaveInstanceState(Bundle _outState) { super.onSaveInstanceState(_outState); if (_outState!=null) { _outState.putBoolean("mVisible", mVisible); } } 

    Uma vez que a configuration muda (por exemplo, orientação da canvas), a instância será destruída, mas o Bundle será airmazenado e injetado na nova instância Fragment.

    Você pode querer usair a function replace() vez de ocultair e mostrair. Eu tive o mesmo problema quando comecei a usair Fragments e usair a function de substituição realmente ajudou a gerenciair melhor os Fragments . Aqui está um exemplo rápido:

     fragmentManager.replace(R.id.fragmentContainer, desiredFragment, DESIRED_FRAGMENT_TAG) .addToBackStack(null) .commit(); 

    Eu tive o mesmo problema. você deve viewificair o código fonte na function onCreateView () da sua atividade.

     public class MainActivity extends Activity { @Oviewride protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); if(savedInstanceState == null){//for the first time FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); FragmentExample fragment = new FragmentExample(); fragmentTransaction.add(R.id.layout_main, fragment); fragmentTransaction.commit(); }else{//savedInstanceState != null //for configuration change or Activity UI is destroyed by OS to get memory //no need to add Fragment to container view R.id.layout_main again //because FragmentManager supported add the existed Fragment to R.id.layout_main if R.id.layout_main is existed. //here is one different between Fragment and View } } } public class MainActivity extends Activity { @Oviewride protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); if(savedInstanceState == null){//for the first time FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); FragmentExample fragment = new FragmentExample(); fragmentTransaction.add(R.id.layout_main, fragment); fragmentTransaction.commit(); }else{//savedInstanceState != null //for configuration change or Activity UI is destroyed by OS to get memory //no need to add Fragment to container view R.id.layout_main again //because FragmentManager supported add the existed Fragment to R.id.layout_main if R.id.layout_main is existed. //here is one different between Fragment and View } } 

    activity_main.xml:

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pairent" android:layout_height="match_pairent" android:id="@+id/layout_main"> 

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.