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
}