🚀 8.4 Modularização com Fragments e ViewBinding

Os Fragments são o segredo para construir aplicativos que escalam de smartphones para tablets sem duplicar código. Eles funcionam como “peças de Lego” da sua interface, possuindo seu próprio ciclo de vida e lógica, mas sempre hospedados por uma Activity.

Anatomia de um Fragment Moderno (Java 17)

Diferente das Activities, o ciclo de vida do Fragment exige um cuidado especial com a memória, especialmente ao usar ViewBinding.

public class ViagemListFragment extends Fragment {
    
    private FragmentViagemListBinding binding;
 
    @Nullable
    @Override
public View onCreateView(@NonNull LayoutInflater inflater, 
                             @Nullable ViewGroup container, 
                             @Nullable Bundle savedInstanceState) {
        // Infla o layout usando ViewBinding
        binding = FragmentViagemListBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }
 
    @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
    // Toda a lógica de UI deve ficar aqui, após a View ser criada
    configurarRecyclerView();
}
    @Override
public void onDestroyView() {
        super.onDestroyView();
    // IMPORTANTE: Limpe o binding para evitar vazamentos de memória
    binding = null;
}

}

## Comunicação entre Fragments (Premium)
 

Antigamente, usávamos interfaces complexas para fazer um Fragment falar com outro. A Engenharia Premium utiliza o Fragment Result API, que é desacoplado e seguro:

1. Enviando Dados (Fragment A)

var result = new Bundle();
result.putLong("viagemId", id);
getParentFragmentManager().setFragmentResult("viagemSelecionada", result);

2. Recebendo Dados (Fragment B)

getParentFragmentManager().setFragmentResultListener("viagemSelecionada", this, (requestKey, bundle) -> {
    var id = bundle.getLong("viagemId");
    carregarDetalhes(id);
});

Layouts Multi-pane (Celular vs Tablet)

No BoaViagem, utilizaremos uma estratégia de “Master-Detail”:

  • No Celular: A lista de viagens ocupa a tela toda. Ao clicar, abrimos uma nova tela de detalhes.
  • No Tablet: A lista e os detalhes aparecem lado a lado.

IMPORTANT

FragmentManager: Utilize sempre o getSupportFragmentManager() em vez do getFragmentManager() (depreciado). Isso garante que seu código funcione de forma consistente em todas as versões do Android através da biblioteca AppCompat.

TIP

No Android Studio 2023.1, utilize o assistente New > Fragment > Fragment (with ViewModel) para criar automaticamente a estrutura modular recomendada pela Google, separando a lógica de dados da interface.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️