🚀 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 dogetFragmentManager()(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.