1
resposta

Comportamento das fragments não funciona bem mudando a orientação do app

Nesta última etapa da aula de "Reaproveitando telas com Fragments" há dois comportamentos incorretos que não foram tratados.

Alteramos o comportamento do botão de Back do aparelho adicionando a transação do Fragment na pilha com:

tx.addToBackStack(null);

Porém, quando abrimos os detalhes da prova no modo retrato e rotacionamos o aparelho para o modo paisagem, há dois bugs que não foram tratados na aula:

  1. Quando rotacionamos, a lista das provas e os detalhes aparecem juntos, então é esperado que ao pressionar o botão de Back retornemos para a lista de alunos. Porém é necessário apertar o botão de Back duas vezes, pois na primeira vez nada ocorre. Acredito que tenha esse comportamento pois o Fragment continua na pilha após mudar a orientação, então ao pressionar o botão Back o Android retorna para a mesma Activity dando a impressão que nada aconteceu. Como corrigir?

  2. Se eu estou com os detalhes de uma prova aberto em modo retrato, eu espero que ao mudar para o modo paisagem estes detalhes continuem aparecendo. Mas da forma que fizemos, se os detalhes estão sendo exibidos na orientação de retrato, ao rotacionar o aparelho os dados são zerados. Como corrigir isso?

Sei que são apenas pequenos detalhes, mas fazem grande diferença para o usuário final.

Desde já agradeço quem puder ajudar. Meu código está exatamente igual ao da aula.

Abraços.

1 resposta

E aí Bruno, tudo bem ?

Cara a primeira "falha" que você destacou, acredito que o curso já contemple, que na hora que estamos com o layout da tela na horizontal, no nosso onCreate(), deveria haver um if fazendo a validação para adicionar os fragments, correto ?

Então devemos ter um código similar a este :


        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        ProvasFragment fragment = new ProvasFragment();
        transaction.replace(R.id.frame_provas, fragment);

        if (isTablet()) {
            transaction.replace(R.id.frame_provas_detalhada, new DetalhesFragment());
        }

Repare que nesse código em momento algum falei que seria necessário adicionar o segundo fragment, que apenas entra se tela for um tablet, no caso do curso se estiver em modo retrato.

E quando rola o click da lista, você tem que fazer a verificação novamente, caso esteja com a tela virada, apenas precisa atualizar o fragment de detalhes, caso contrário fazer a substituição dos fragments.

Já o segundo ponto que você disse é um pouco mais complexo, porque é necessário saber um pouco sobre a questão de manter o estado da tela no momento de rotação, escrevi um post onde falo um pouco sobre isso e como você deve utilizar o ciclo de vida para poder manter o estado, dá uma olhadinha nele :

http://blog.alura.com.br/salvando-informacoes-do-formulario-no-android/

Vai vou deixar aqui mais ou menos o que você vai precisar fazer, no momento em que você virar o aparelho, vai precisar salvar a prova selecionada na activity e quando ela for reconstruída você terá que fazer os passos para exibi-la.

Espero ter ajudado.

Abraços