Vimos no post Aplicando o padrão de projeto State para gerznciar fragments. - PARTE 1 como criar uma estrutura de organização de fragments utilizando Enum.
Agora vamos trabalhar na classe PageManager.java, nela que iremos ter a utilização do Enum e o resultado das regras implementadas no padrão State. A estrutura inicial dela é a seguinte:
Note que a classe implementa a interface chamada FragmentState e através do método onFragmentRemoved o PageManager saberá quando o fragment não estará mais sendo usado e o removerá do seu respectivo PageId.
Nela temos uma variável chamada currentPage que será responsável por guardar o id da página atual e também a activity.
Depois aplicamos o padrão Singleton para garantir sempre a mesmas instância da classe.
Logo em seguida temos o método da classe, goToPage. Nele que ocorrerá a mágica.
"Não é a linguagem de programação que define o programador, mas sim sua lógica."
Provavelmente você deve ter se perguntado: "Mas onde estamos verificando se o fluxo de tela está correto?", nesse momento tudo nos leva a usar o if/else ou um switch e criarmos essa regra, mas com muitos fragments isso ia ficar bem complicado de manter, então, antes de implementarmos o goToPage vamos fazer uma modificação no Enum PageId.java, para criamos de fato as regras de navegação baseado no padrão State.
O que faremos é criamos o método getNextPage( PageId actualPage ), e todos os itens do meu enum terão que sobrescrever ele, caso contrário, ele lançará uma exceção.
Traduzindo esse trecho de código, estamos dizendo que a partir da tela SPLASH queremos ir para a próxima tela e pedimos para ela nós fornecer a classe uma instancia TransitionPageConfig.java. Essa classe é responsável por configurar a transição das telas, no caso as transições SPLASH -> LOGIN e SPLASH -> HOME.
os xmls usados nas animações podem ser baixados aqui.
Enum finalizado, iremos terminar o goToPage inserindo as seguintes regras:
1 - Verificar próximo fluxo, caso sejá válido, lançar uma exceção.
2 - Configurar a animação.
3 - Caso o fragment atual esteja no container_2 e a próxima tela irá estar no container 1, então :
3.1 - Verificar se o fragment no container_1 precisa ser alterado.
3.1.1 - Caso o próximo fragment já está no container_1, então, apenas remova o fragment do container_2.
3.1.1 - Caso o próximo fragment já está no container_1, então, apenas remova o fragment do container_2.
3.1.2 - Caso o próximo fragment não está no container_1, então, devemos mudar o fragment do container_1 e depois remover o fragment do conteiner_2.
OBS: Todo projeto pode ser encontrado no meu GitHub