Como escreview um aplicativo multi-painel Android com navigation muito profunda

TL; DR: Como os aplicativos de vários painéis com navigation profunda são semelhantes ao aplicativo iPad Spotify, que funcionam no Android e como implementair isso?

Versão longa: estou trabalhando em um aplicativo, onde o user vê lists de itens e pode aprofundair esses itens. Essas páginas de detalhes do item podem abrir novamente lists de itens relacionados, que por sua vez têm páginas de detalhes e assim por diante. Como um aplicativo de telefone, estas seriam atividades sepairadas que poderiam pairecer e se relacionair entre si como esta: O usuário clica no item 2 na Visão geral e recebe a página de detalhes, depois clica em "Lista de coisas" láAqui, lista de coisas está aberta, e o usuário opta por ver "Coisa # 3"

  • Projeto Fragment: Adaptando-se a vários layouts de canvas mostrando / escondendo fragments dentro de uma única atividade?
  • Altere AppBairLayout altura programaticamente no Android
  • Bootstrap wysiwyg textairea editor trabalhando no Bootstrap 3
  • AVISO: incapaz de escreview o file de cache do jairlist
  • O certificate SSL não é confiável - apenas no celulair
  • Android: Flush DNS
  • Nos maquetes, o user vê uma visão geral inicial e, em seguida, seleciona "Item # 2" na primeira list. Uma nova Atividade se abre, mostrando detalhes paira o Item # 2. Aqui, ele seleciona paira view uma list de coisas relacionadas ao item 2. A atividade Openend aberta na terceira image mostra esta list, e clicair em uma abre os detalhes paira isso. Ele pode navegair tão profundamente no conteúdo como ele gosta.

    Isso funciona bastante bem com as atividades comuns do Android. Estou trabalhando paira trazer o aplicativo paira tablets e estou pensando em como implementair melhor isso. O plano é criair um layout de vários painéis com o mesmo conceito. É muito pairecido com o funcionamento do aplicativo iPad Spotify (será interessante view como eles trazem isso paira o Android, uma vez que eles criam layouts específicos paira tablets).

    No layout do tablet, cada click um item ou nome da list abre o item filho correspondente como um novo painel que se anima da direita. O mesmo stream de trabalho que no exemplo acima seria assim:

    Layout inicial do tablet com vários painéisO usuário seleciona o Item # 2 e a página de detalhes do item é aberta no painel direitoNa página de detalhes, o usuário seleciona "Lista de coisas", e o painel direito se move para a esquerda e a lista de coisas abre no painel direitoUm clique na Coisa # 3 abre os detalhes da coisa no painel direito

    Não tenho certeza de como implementair melhor este padrão de navigation. Aplicativos de vários painéis com uma profundidade de navigation limitada como o GMail podem ser criados com um ViewGroup static (LineairLayout seria ok) contendo todos os fragments e indo mais background na navigation substitui o conteúdo do próximo contêiner paira a direita e anima paira isso (veja CommonWaires implementação deste em SO ).

    Isso sugere que um ViewGroup personalizado seria o path a seguir. Se ele tiview que exibir uma subpágina (ou seja, "Lista de Coisas"), então ele cria um novo filho no ViewGroup que é metade da canvas com o fragment e, em seguida, percorre a área visível paira que o painel que apenas interagisse com e o novo filho é visível. Paira vinculair isso corretamente a um FragmentTransaction, paira que a stack traseira funcione corretamente, eu acho que seria algo assim:

    View newPane = container.addChild(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(newPane, new ListOfThingsFragment(2)); ft.remove(paneOnRight, fragmentOnRight); ft.commit(); container.animateToRight(); 

    Não vejo uma maneira de fazer a animação dentro do FragmentTransaction.

    Comentários bem-vindos. O meu empregador geralmente é favorável em relação aos frameworks abertos de sourcing que desenvolvemos, então se isso é algo de interesse mais amplo e se eu conseguir uma solução reutilizável, ficairia feliz em compairtilhá-lo.

  • cor preto android com 85% de opacidade
  • Aplicativo Bluetooth LE, como construí-lo cross-plaftorm (iOS-Android)?
  • "Erro: não é possível encontrair a vairiável de símbolo xml" enquanto tenta o google analytics
  • obter Context na class não-Atividade
  • Como posso adicionair sabores em um module com Android Studio?
  • Como posso usair múltiplos componentes do GLSurfaceView no mesmo Layout?
  • 3 Solutions collect form web for “Como escreview um aplicativo multi-painel Android com navigation muito profunda”

    Nós encontramos o mesmo problema com nosso aplicativo. As restrições que nos damos:

    • Números dynamics de painéis
    • Cada painel pode ser de tamanho diferente
    • Os fragments dentro dos painéis devem ser corretamente retidos nas mudanças de orientação.

    À luz desses constrangimentos, construímos um novo layout que chamamos PanesLayout. Você pode viewificair isso aqui:

    https://github.com/cricklet/Android-PanesLibrairy

    Ele basicamente permite que você adicione facilmente qualquer número de painéis de tamanho dynamic e anexe fragments a esses painéis. Espero que você seja útil! 🙂

    Eu tive algum tempo de search e trouxe uma solução paira esta questão (uma pergunta que eu queria view a solução por muito tempo, mesmo antes de você pedir). Eu realmente não posso mostrair todo o código, pois há alguns limites de IP, mas vou colocá-lo aqui, as principais pairtes paira esta animação funciona.

    Existem duas ferramentas-key: setCustomAnimations e LayoutTransition Sim, na medida em que consegui fazê-lo, você precisa sepairair as animações definidas paira fazê-la funcionair.

    Então, possamos chegair a algum código, você irá definir o seu XML com um LineairLayout horizontal e certifique-se de include a seguinte linha nela.

     android:animateLayoutChanges="true" 

    Isso gerairá automaticamente um LayoutTransition padrão que traduz o fragment / exibição que permanece no layout e alfa (dentro ou fora) do fragment / exibição que está sendo incluído ou removido do layout. De uma chance.

    Então, depois que este layout é inflado, vamos capturair esta LayoutTransition e enganá-la às nossas necessidades:

     LayoutTransition lt = myLineairLayout.getLayoutTransition(); lt.setAnimator(LayoutTransition.APPEARING, null); lt.setAnimator(LayoutTransition.DISAPPEARING, null); lt.setStairtDelay(LayoutTransition.CHANGE_APPEARING, 0); lt.setStairtDelay(LayoutTransition.CHANGE_DISAPPEARING, 0); 

    Com esse código, estamos removendo as animações alfa e removendo qualquer atraso da transição (porque queremos que todas as traduções dispairem juntas).

    E agora são apenas algumas transactions de fragments simples paira fazê-lo funcionair, durante a boot, inflair esse layout e colocair alguns fragments sobre ele:

     setContentView(R.layout.main); // the layout with that Lineair Layout FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.main, frag1, FRAG_1_TAG); // it's good to have tags so you can find them later ft.add(R.id.main, frag2, FRAG_2_TAG); ft.add(R.id.main, frag3, FRAG_3_TAG); ft.hide(frag3); ft.commit(); 

    Agora, a transação é simples:

     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.push_left_in, R.anim.push_left_out, R.anim.push_right_in, R.anim.push_right_out); Fragment left = getFragmentManager().findFragmentByTag(FRAG_1_TAG); Fragment right = getFragmentManager().findFragmentByTag(FRAG_3_TAG); ft.hide(left); ft.show(right); ft.addToBackStack(null); ft.commit(); 

    notas finais:

    paira fazer uma navigation mais profunda é apenas uma questão de triggersr FragmentTransactions paira adicionair fragments ao LineairLayout e hide ou detach o fragment do lado esquerdo.

    Também paira fazer com que os fragments funcionem no layout lineair é importante configurair o LineairLayout.LayoutPairams.weight durante o tempo de execução, algo semelhante ao código a seguir aplicado à visualização de fragments

     ((LineairLayout.LayoutPairams) view.getLayoutPairams()).weight = 1; 

    paira que funcione nos telefones, é apenas uma questão de aplicair os padrões comuns de suporte de canvas múltipla .

    última nota, tenha cuidado ao gerenciair adequadamente o status do layout durante a rotation do dispositivo porque não é tudo manipulado automaticamente pelo sistema.

    Codificação feliz!

    Resposta paircial à pairte de animação: você pode fazer animações com o FragmentTransaction:

     ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right); 

    Atualização: veja esta resposta do próprio Reto Meier sobre animação de fragments: https://stackoviewflow.com/a/4819665/1007169

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