Imprimir este capítuloImprimir este capítulo

Livro 3 - Projeto Agenda de Contatos - Parte 2

4. Programando as transições

4.4. Classe DetailFragment

A classe DetailFragment fornece os detalhes de um contato selecionado.

4.4.1 Importações e Campos

O fragmento DetailFragment deve apresentar os dados de um contato específico portante deve armazenar o código do contato selecionado em uma variável. Além disso, para prosseguir com as transições entre telas é preciso fazer a importação correta da constante CONTACT_ID presente na atividade principal. 

import static com.bcalegaro.agendadecontatos.MainActivity.CONTACT_ID;

public class DetailFragment extends Fragment {
private int contactID; // ID do contato selecionado
// TODO componentes TextView
private DetailViewModel detailViewModel; // ViewModel do fragmento

O fragmento usará a ViewModel para manipular os dados do contato selecionado.

4.4.2 Método onCreateView

O método onCreateView configura o fragmento para possuir um menu e faz a leitura do ID do contato recebido. A leitura do contato recebido é realizada com o objeto arguments da classe Bundle.

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// cria o fragmento com o layout do arquivo details_fragment.xml
View view = inflater.inflate(R.layout.detail_fragment, container, false);
// configura o fragmento para exibir itens de menu
setHasOptionsMenu(true);
// TODO componentes textview
// acessa a lista de argumentos enviada ao fragmento em busca do ID do contato
Bundle arguments = getArguments();
if (arguments != null)
contactID = arguments.getInt(CONTACT_ID);
return view;
}

Para vincular um menu a uma atividade/fragmento é preciso ativar a opção através do método setHasOptionsMenu. A correta configuração do menu será realizada através de dois métodos auxiliares onCreateOptionsMenu e onOptionsItemSelected, implementados logo a seguir.

4.4.3 Métodos onCreateOptionsMenu e onOptionsItemSelected

O método onCreateOptionsMenu defini qual menu será adicionado à atividade ou fragmento e inicia seu carregamento. Para este fragmento vamos usar recurso xml criado na parte 1 do projeto chamado fragment_details_menu. Para programar a ação a ser executada ao se clicar nos ícones do menu precisamos implementar o método onOptionsItemSelected. Esse método seleciona qual item de menu foi clicado e encaminha para a ação desejada.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
// seleciona o menu a ser mostrado no fragmento
inflater.inflate(R.menu.detail_fragment_menu, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_edit:
editContact();
return true;
case R.id.action_delete:
deleteContact();
return true;
}
return super.onOptionsItemSelected(item);
}

4.4.4 Método editContact

Quando o usuário tocar item de menu para excluir um contato o método editContact é invocado. Esse método solicita ao NavController a transição para o fragmento addEditFragment repassando o ID do contato.

// passa o ID do contato para editar no DetailFragmentListener
private void editContact(){
//cria um pacote de argumentos
Bundle arguments = new Bundle();
// adiciona o ID do contato como argumento a ser passado ao fragmento
arguments.putInt(CONTACT_ID, contactID);
//solitica a transição de tela para o fragmento de editar um novo contato
Navigation.findNavController(getView()).navigate(R.id.action_detailFragment_to_addEditFragment, arguments);
}

4.4.5 Método deleteContact

Quando o usuário tocar no item de menu para excluir um contato, o método deleteContact é invocado. Sua implementação completa se dará na parte 3 deste projeto, por ora, vamos programar apenas a transição de tela que neste caso será a de voltar a tela anterior. Novamente, não é necessário acionar uma ação no NavController, apenas invocar o método popBackStack.

// exclui um contato
private void deleteContact() {
// TODO deletar contato
// solicita o retorno a tela anterior
Navigation.findNavController(getView()).popBackStack();
}

4.4.6 Método onActivityCreated

O método de ciclo de vida onActivityCreated de Fragment é chamado depois que a atividade hospedeira de um fragmento foi criada e o método onCreateView terminou de executar. Usamos esse método para configurar a ViewModel. No entanto, nesta segunda parte do projeto apenas arrumar a nomenclatura do campo para conferir com detailViewModel.

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
detailViewModel = new ViewModelProvider(this).get(DetailViewModel.class);
// TODO: Use the ViewModel
}