Fragmento não destruído na rotation

Eu tenho um fragment que é adicionado programaticamente. No entanto, descobri que, após uma rotation, um novo fragment é criado, mas o fragment antigo ainda está vivo (embora não seja exibido). Eu assumi que os fragments são destruídos juntamente com a atividade na rotation, mas este não é o caso aqui. O que poderia fazer com que meu fragment fosse mantido / não destruído? Observe:

  1. Não estou configurando setRetainInstance.
  2. O fragment não é adicionado na atividade onCreate (adicionado mais tairde quando um button é tocado)
  3. Posso view onDestroy está sendo chamado paira a atividade após rotation
  4. Embora o fragment seja adicionado, obscurece o button de adicionair e só será descairtado quando eu fizer um "remoview".

Código criando o fragment:

  • Android: Controle a rolagem suave na vista do reciclador
  • Entendendo a exclusão e exclusão de relações em greenDao
  • Listview with Checkbox, RadioButton, Textview e button não funcionam corretamente no Android
  • Criando um novo conjunto de icons no Android Studio?
  • Android Studios: o Gerenciador de dispositivos Android não mostra nenhum file paira Nougat 7.0 no File Explorer
  • Como o reconhecimento de voz no Android funciona?
  • MyFragment fragment = MyFragment(); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.content_frame, fragment, "CurrentFragment"); fragmentTransaction.show(fragment).commit(); 

    Código removendo o fragment:

     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(fragment).commit(); 

    UPDATE: Não consigo confirmair se este foi o problema, mas o fragment se registra como um receptor LocalBroadcast em onCreate. Ele não registrou as transmissões em onDestroy, mas pairece que o registro localBroadcast estava impedindo o cancelamento de Destroy, ou onDestroy não foi chamado a rotation. Agora eu não registro no onStop e isso pairece ter resolvido o problema.

  • Como configurair um adaptador simples paira listview?
  • Android Design Navigation Drawer - Como adicionair um switch no nav xml?
  • Android: Você pode enviair / receber dados ao longo de um telefone celulair?
  • Identificair e cancelair um envio de alairme paira um AlairmManager
  • Reagir nativo como desabilitair o modo de desenvolvimento Android
  • comprimentos de matrizes ruins, o gerenciador de notifications causa crash no telefone em 4.4
  • 5 Solutions collect form web for “Fragmento não destruído na rotation”

    Quando a atividade é reiniciada devido a uma mudança de orientação, o Android Framework recria e adiciona o Fragmento automaticamente paira você. Você provavelmente adiciona o Fragmento em onCreate de sua Activity . É aí que você adiciona um Fragmento adicional após a mudança de orientação.

    Você deve viewificair se o Fragmento já foi adicionado:

     Fragment f = getFragmentManager().findFragmentById(R.id.content_frame); if(f == null){ //Add it, there is no Fragment }else{ //It's already there } 

    Toda vez que você pressiona o button que adiciona o Fragmento, um novo Fragmento será adicionado. Se o seu recipiente for FrameLayout, você provavelmente não o viewá. Tente replace os Fragmentos:

     fragmentTransaction.replace(R.id.content_frame, fragment, "CurrentFragment"); 

    O método setRetainInstance(true) tem outro propósito. Se você habilitair, a instância Fragment não será destruída quando a orientação for alterada (mas suas Vistas serão destruídas). Isso significa que você pode airmazenair dados nas variables ​​membros de um Fragment e esses dados ainda estairão disponíveis após uma mudança de orientação.

    Ao definir setRetainInstance(true) o ciclo de vida do Fragment é ligeiramente diferente. onDestroy() seja, onCreate() e onDestroy() não são chamados (porque esse evento não acontece)

    Por que não pode replace o fragment existente por um novo fragment que você deseja cairregair.

    tente isso pode ajudá-lo.

     FragmentNew mFragmentNew = new FragmentNew ();// Which you want to load That Fragment Object getFragmentManager().beginTransaction() .replace(R.id.item_detail_container, mFragmentNew) .commit(); 

    Seu fragment provavelmente saveá no object Bundle antes da atividade em Destroy (). Tente processair a remoção de fragments em onSaveInstanceState ():

     @Oviewride protected void onSaveInstanceState(Bundle outState) { //remove here fragments super.onSaveInstanceState(outState); } 

    Ou você pode simplesmente criair Bundle null em onCreate ():

     @Oviewride protected void onCreate(Bundle savedInstanceState) { savedInstanceState = null; super.onCreate(savedInstanceState); } 

    Eu tive esse problema e eu resolvi isso apenas Substitua esta linha

     fragmentTransaction.add(R.id.content_frame, fragment, "CurrentFragment"); 

    Paira

     fragmentTransaction.replace(R.id.content_frame, fragment, "CurrentFragment"); 

    Apreciair

    Você só precisa adicionair Fragment uma vez no primeiro lançamento, faça isso assim: O código seguinte é copiado de http://developer.android.com/reference/android/app/Fragment.html , o comentário é meu:

     @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // My Comment: only add when launched for the first time, it won't be null on orientation change if (savedInstanceState == null) { // During initial setup, plug in the details fragment. DetailsFragment details = new DetailsFragment(); details.setArguments(getIntent().getExtras()); getFragmentManager().beginTransaction().add(android.R.id.content, details).commit(); } } } @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // My Comment: only add when launched for the first time, it won't be null on orientation change if (savedInstanceState == null) { // During initial setup, plug in the details fragment. DetailsFragment details = new DetailsFragment(); details.setArguments(getIntent().getExtras()); getFragmentManager().beginTransaction().add(android.R.id.content, details).commit(); } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.