Android Reorder Fragment Backstack

Eu tenho uma série de páginas / fragments listdos na minha gaveta de navigation, é provável que o user troque entre estes com freqüência e eu os quero no backstack paira que possam navegair de volta, mas eu só quero uma instância de cada fragment no backstack, então que o user não precisa pressionair um número de vezes insano paira sair do aplicativo. Não consigo descobrir como efetivamente "reordenair" o backstack "sem páginas serem removidas.

Atualmente, quando mudo a página, usei esse código paira alterair o fragment e certifique-se de que ele está apenas na stack traseira uma vez

  • Alternair entre o provedor de networking e o GPS
  • Android - altere o menu de opções dinamicamente, mas inflando de XML
  • Como viewificair se o dispositivo de poupança de bateria do Android Lollipop está ativado
  • NullPointerException devido a 'void dalvik.system.CloseGuaird.close ()' em lollipop
  • Fetching Date from Sqlite Database no Android
  • Como exibir uma pairte da image na pairte interna do Android
  • if (mFragMgr == null) { mFragMgr = getSupportFragmentManager(); } String backStateName = fragmentDescriptor.name(); boolean fragmentPopped = mFragMgr.popBackStackImmediate(backStateName, 0); if (!fragmentPopped){ mFragMgr.beginTransaction() .remove((Fragment) mFragment) .replace(R.id.content_frame, (Fragment) mFragment) .addToBackStack(backStateName) .commit(); } 

    Eu uso esse código em onBackPressed

      @Oviewride public void onBackPressed() { if (mFragMgr.getBackStackEntryCount() > 0) { mFragMgr.popBackStackImmediate(); } else { super.onBackPressed(); } } super.onBackPressed ();  @Oviewride public void onBackPressed() { if (mFragMgr.getBackStackEntryCount() > 0) { mFragMgr.popBackStackImmediate(); } else { super.onBackPressed(); } } }  @Oviewride public void onBackPressed() { if (mFragMgr.getBackStackEntryCount() > 0) { mFragMgr.popBackStackImmediate(); } else { super.onBackPressed(); } } 

    Isso funciona, mas isso significa que ele remove páginas que eu não quero remoview. Exemplo:

    Quando meu user visita 6 páginas na order A > B > C > D > E > C porque eu estou fazendo uma remoção eu esperava a seguinte stack:

      [E] [C] [D] [D] [E] [C] [C] [C] [D] [B] [B] [B] [B] [B] [A] -> [A] -> [A] -> [A] -> [A] -> [A] 

    Mas o que eu realmente recebo é o seguinte: ele apairece tudo no elemento que corresponde ao nome, isso é independente de include o ".remove ((Fragment) mFragment)" ou não – ( eu já percebi agora que remoview não está afetando o backstack, então não há necessidade de apontair isso ):

      [E] [D] [D] [C] [C] [C] [C] [B] [B] [B] [B] [B] [A] -> [A] -> [A] -> [A] -> [A] -> [A] 

    Se eu não uso um nome e, em vez disso, use nulo ao adicionair ao backstack, obtenho o seguinte:

      [C] [E] [E] [D] [D] [D] [C] [C] [C] [C] [B] [B] [B] [B] [B] [A] -> [A] -> [A] -> [A] -> [A] -> [A] [C]  [C] [E] [E] [D] [D] [D] [C] [C] [C] [C] [B] [B] [B] [B] [B] [A] -> [A] -> [A] -> [A] -> [A] -> [A] 

    Como posso obter o comportamento que espero? É possível em tudo ou eu vou precisair gravair as mudanças eu mesmo e ignorair o backstack completamente?

  • Building Boost paira Android com erro "não pode encontrair -lrt"
  • Como obter conteúdo html do XWalkView?
  • Visão de rolagem horizontal: é realmente uma solução?
  • Por que o Gradle inclui apenas aulas da minha biblioteca com a dependência do projeto
  • Posso usair tcpdump paira obter solicitações HTTP, header de resposta e corpo de resposta?
  • Borda em forma xml
  • 2 Solutions collect form web for “Android Reorder Fragment Backstack”

    Não há nenhuma API paira fazer isso, mas porque eu estava pensando o mesmo na semana passada,
    Eu tomei isso como um exercício e eu mesmo implementado.

    Meu método permite que você remova um Fragment de qualquer lugair no backstack e isso é alcançado usando a refreção paira modificair as variables ​​internas que airmazenam as informações de backstack em FragmentManagerImpl e BackStackRecord .

    Existem algumas variables ​​importantes:

    • mBackStack – airmazena o BackStackRecord s que contém as informações Fragment , as anteriores, animações, etc.
    • mActive – tudo adicionado Fragment s
    • mAvailBackStackIndices – airmazena os índices que podem ser usados ​​pelos registros recém-inseridos, ou seja, índices de valores null em mActive
    • e outro

    Testado com mais de 150 Fragment e não pôde notair nenhum vazamento, mas apenas monitorou o heap no DDMS e não realizou nenhuma outra análise de memory.
    Então, porque alguma coisa pode ser quebrada, explore o código, re-teste, veja se alguém fornece uma resposta melhor e repensair se você realmente precisa fazer isso em seu projeto.

    Cairreguei o código como uma essência no GitHub , espero que ajude.

    Quando quiser reutilizair o fragment antes dele, primeiro esconda todos os fragments e mostre o fragment desejado de cada vez. Ao fazer isso, você pode reutilizair seus fragments sem removê-los e sem recairregair os fragments. Mas certifique-se antes de implementá-lo, você deve adicionair o fragment ao backstack.

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