4. Menus

4.2. Programação de Menus

A API do Android evoluiu, e a abordagem tradicional para lidar com menus por meio de métodos como setHasOptionsMenu, onCreateOptionsMenu e onOptionsItemSelected foi marcada como obsoleta.

A forma recomendada agora é usar o MenuProvider, uma interface moderna e mais flexível para gerenciar menus em atividades e fragmentos. O MenuProvider não apenas substitui os métodos anteriores, mas também oferece uma integração mais alinhada com o ciclo de vida do componente, facilitando o gerenciamento e a modularização do código.

Adicionando menus e ações ao fragmento Home

Abra o arquivo HomeFragment.kt e edite o método onViewCreated para incluir o menu criado anteriormente e adicionar uma implementação ao clique no item de Logout.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

val menuHost: MenuHost = requireActivity()

menuHost.addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.menu_main, menu)
}

override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
return when (menuItem.itemId) {
R.id.action_logout -> {
logOut()
true
}
else -> false
}
}
}, viewLifecycleOwner, Lifecycle.State.RESUMED)
}

O MenuProvider é registrado no MenuHost da atividade ou do fragmento usando o método addMenuProvider. Essa abordagem substitui os métodos tradicionais agora obsoletos, como onCreateOptionsMenu e onOptionsItemSelected.

Durante essa implementação, usamos um objeto anônimo da interface MenuProvider, que contém as definições sobre como o menu será criado e manipulado. Além disso, o menu é vinculado ao ciclo de vida da view do fragmento utilizando o viewLifecycleOwner. Essa prática garante que o menu só estará ativo enquanto a view do fragmento estiver ativa, evitando problemas de interações inválidas após a destruição do fragmento. O parâmetro Lifecycle.State.RESUMED especifica que o menu só estará disponível quando o fragmento ou atividade estiver no estado ativo e visível.

A criação do menu ocorre dentro do método onCreateMenu. Nele, utilizamos o menuInflater para inflar um arquivo XML que define a estrutura do menu, como neste exemplo em que o arquivo R.menu.main_menu é carregado. Esse processo substitui diretamente o antigo método onCreateOptionsMenu, permitindo que o menu seja exibido na interface quando a atividade ou fragmento inicia. O arquivo XML define os itens e suas propriedades, e esse método é responsável por vinculá-los à interface gráfica.

A manipulação de eventos do menu acontece no método onMenuItemSelected. Esse método é chamado sempre que o usuário interage com um item do menu. Ele verifica qual item foi selecionado utilizando o identificador único de cada item, definido no arquivo XML. Com base no item clicado, o código pode executar ações específicas. No aplicativo Lista de Tarefas só existe um menu, portanto, apenas uma ação, a de logout do usuário. Esse método substitui o antigo onOptionsItemSelected e garante uma experiência interativa e responsiva para o usuário.

A adoção do MenuProvider traz várias vantagens. Ele simplifica o ciclo de vida do menu, garantindo que esteja vinculado ao ciclo correto, reduzindo problemas com fragmentos que interagem com menus já destruídos. Além disso, separa a lógica de criação e manipulação, tornando o código mais modular e fácil de manter. Essa abordagem está alinhada com as práticas modernas do Android e oferece maior flexibilidade no desenvolvimento de aplicações.