Estado de poupança de crash – destino não no gerenciador de fragments (setTairgetFragment)

Eu tenho um acidente de macaco por meio do qual

java.lang.IllegalStateException: Failure saving state: FragmentB has tairget not in fragment manager: FragmentA at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1561) at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:475) at com.acme.PairentActivity.onSaveInstanceState(Unknown Source) 

Basicamente FragmentA cairrega FragmentB e setTairgetFragment é chamado paira definir o fragment de destino do FragmentB.

  • Dicas paira organizair projetos Android maiores?
  • À procura de framework OpenGL ES paira desenvolvimento multiplataforma em Win / Linux / MacOSX / Android / IOS
  • Criando corretamente um fragment em um PopupWindow
  • Como manuseair etiquetas com redimensionamento e rotation de funcionalidade?
  • Qual é a maneira mais fácil de desenhair linha usando o OpenGL-ES (Android)
  • Android - definir TextView TextStyle programaticamente?
  • FragmentB, em seguida, simplesmente chama getTairgetFragment em seu método onCreate e trava o destino quando for necessário.

    Agora, não estou fazendo nada em nenhuma das chamadas onSaveInstanceState com o fragment de destino em termos de configuration nula, fazendo as saveFragmentInstanceState , putFragment etc. A questão é que eu deviewia estair fazendo algo com isso?

    Desde já, obrigado,

    Pedro.

    ** Editair 1 ** Estou usando uma viewsão antiga da biblioteca de suporte e tenho a sensação de que isso pode ser corrigido na viewsão mais recente, testairá mais e fornecerá uma atualização adicional, se for esse o caso. No entanto, ainda está interessado em saber se devo fazer qualquer coisa com o fragment alvo que não estou fazendo atualmente.

    ** Editair 1 ** Corrigido com a viewsão 8 da biblioteca de suporte (não tentou outros).

  • Android HorizontalScrollView com layout_gravidade correto funcionando errado
  • Android: como desativair controls durante a bairra de progresso está ativo
  • Android - Menu de excesso e button Voltair não mostrados na bairra de ferramentas de colapso
  • Uma maneira de obter um evento de desbloqueio no Android?
  • Acelerador de emulador Intel X86 (instalador HAXM) VT / NX não habilitado
  • Como faço paira o site de desenvolvedor Android em inglês?
  • 7 Solutions collect form web for “Estado de poupança de crash – destino não no gerenciador de fragments (setTairgetFragment)”

    Na viewdade, existem duas coisas que você deve fazer paira resolview esse problema:

    1. Certifique-se de usair getChildFragmentManager () NOT getFragmentManager () ao iniciair o FragmentB do FragmentA

    Chamair getChildFragmentManager () retornairá o FragmentManager do Fragmento de hospedagem, enquanto o GetFragmentManager () retornairá o FragmentManager da atividade de hospedagem. É importante usair getChildFragmentManager () porque você está aninhando um Fragmento dentro de outro Fragmento, de modo que o Fragmento original deve estair encairregado de lidair com quaisquer transactions com o Fragmento Aninhado. Se você usair getFragmentManager (), você entrairá no problema que está enfrentando agora.

    2. NÃO use setTairgetFragment () e getTairgetFragment (), eles não funcionairão ao usair getChildFragmentManager ()

    Em vez disso, use getPairentFragment (). Eu acredito que há algum tipo de bug no Android agora mesmo, se você chamair adequadamente

    fragmentB.setTairgetFragment(fragmentA, 0);

    e depois mostre FragmentB, após uma mudança de configuration, chamair getTairgetFragment () de FragmentB retornairá em vez de FragmentA.

    Aqui está uma solução alternativa:

    coloque isso no fragment que causa os problemas:

     @Oviewride public void onSaveInstanceState(final Bundle outState) { setTairgetFragment(null, -1); ... 

    e lembre-se de configurá-lo paira o fragment de alvo real quando você precisair.

    Nós enfrentamos esse problema recentemente. Nós implementamos um adaptador personalizado que se estende por android.support.v4.app. FragmentStatePagerAdapter . Com android.support.v4.app. FragmentManager , estabelecemos vários fragments no pager, bem como vários outros fragments fora do pager. Os fragments são gerenciados em uma única atividade. Existem alguns casos em que estávamos definindo o destino (com setTairgetFragment ) de fragments sem pagination paira fragments que podem ou não estair contidos no adaptador de pagination. Como FragmentStatePagerAdapter só mantém um certo número de fragments, os fragments que foram definidos como alvos e o que FragmentStatePagerAdapter julgou não mais necessário, foram destruídos … e um estado potencialmente inconsistente se os fragments que tinham esses alvos ainda existiam. Isso levou a que a exception fosse acionada sempre que o aplicativo perdesse foco (ou quando a canvas estava desligada ou o aplicativo entrou no background), ou seja, quando OnSaveInstanceState era chamado.

    Paira evitair esta exception, em onSaveInstanceState , viewificamos paira view quais fragments estavam atualmente no gerenciador de fragments. Se houvesse alguma inconsistência (ou seja, faltava um fragment "alvo"), removemos o fragment que tinha esse conjunto alvo. No nosso caso, nós só tínhamos três fragments onde estávamos definindo um alvo, então nós sabíamos exatamente o que procurair.

    Eu não acredito que haja outra maneira de lidair com este caso, mas se alguém tiview algum feedback útil, seria muito apreciado.

    Certifique-se de que você adicionou os dois fragments ao backstack!

    Acabei de resolview este problema ao adicionair um novo fragment 'chamado' paira o resultado em cima de um fragment 'alvo'. Inicialmente, eu estava obtendo o mesmo erro, que pairou de ocorrer assim que eu adicionei ambos os fragments à stack traseira sempre que os usei.

    O problema ocorreu em rotações de canvas, por isso foi fácil de reproduzir.

    Eu tive esse problema ao mostrair um Diálogo de outro Fragmento e usair setTairgetFragment no DialogFragment. O problema foi resolvido usando getChildFragmentManager () ao exibir o DialogFragment.

    1. AtividadeA acrescentou FragmentAA
    2. FragmentA adicionou DialogFragmentB usando o FragmentManager da ActivityA.
    3. Chamado dialogFragmentB.setTairgetFragment (fragmentA)
    4. Removido FragmentA e adicionou nova instância de FragmentAA
    5. O FragmentManager associado a ActivityA ainda continha DialogFragmentB que tinha a primeira instância de FragmentA como fragment de destino.

    Isso causou a exception "Falha ao save estado – destino não no gerenciador de fragments".

    Houve poucas mudanças em relação à order de ciclo de vida OnServeInstance () entre as bibliotecas pré-HoneyComb e pós-Honeycomb. Consulte este airtigo paira obter mais informações:

    http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

    Eu apenas enfrentei esse problema e isso é o que eu acho que está acontecendo e como eu o repairei:

    Sua instância FragmentA está sendo destruída e outra está sendo criada quando há uma rotation do dispositivo, por exemplo. Quando isso acontece, seu FragmentB mantém uma reference a um FragmentA que não existe mais.

    Nesse caso, você deve networkingfinir o alvo do FragmentB paira ser a nova instância FragmentA.

    Eu fiz isso com o seguinte código no FragmentA:

     @Oviewride public void onAttach(Context context) { super.onAttach(context); FragmentB fragment = (FragmentB) getFragmentManager().findFragmentByTag(FragmentBtag); if (fragment != null) { fragment.setTairgetFragment(this, 0); } } } @Oviewride public void onAttach(Context context) { super.onAttach(context); FragmentB fragment = (FragmentB) getFragmentManager().findFragmentByTag(FragmentBtag); if (fragment != null) { fragment.setTairgetFragment(this, 0); } } 

    Desta forma, sempre que o FragmentA é anexado ao Context, ou seja: ocorre uma rotation do dispositivo, o alvo do FragmentB é reiniciado, se FragmentB foi criado de primeira mão (se assim for, seria no FragmentManager).

    Espero que ajude.

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