Livro 3 - Projeto Agenda de Contatos - Parte 2

4. Programando as transições

4.2. Classe MainFragment

A classe MainFragment exibe a lista de contatos em uma RecyclerView e fornece um FloatingActionButton para a adição de novos contatos.

4.2.1 Importações e Campos

O fragmento MainFragment possui uma ViewModel para vincular os dados de agenda de contatos a uma lista. Esse campo é importante pois será usado para configurar a integração dos dados do banco de dados com a RecyclerView. Renomeie a variável da ViewModel para mainViewModel pois posteriormente escreveremos os demais fragmentos de maneira similar. Também, para a configuração da transição das telas precisamos fazer o uso das constantes declaradas na classe MainActivity por isso certifique-se de colocar as importações corretas. 

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

public class MainFragment extends Fragment {

private MainViewModel mainViewModel;

...
}

4.2.2 Método onCreateView

No método onCreateView vamos inicializar os componentes da interface gráfica definidos no arquivo de layout main_fragment.xml. Futuramente vamos vincular o adaptador a RecyclerView., mas nesta segunda etapa do projeto vamos apenas adicionar o tratamento de eventos do FAB.

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.main_fragment, container, false);

// TODO recyclerView, adapter, itemdivider

// cria uma referencia ao FAB e vincula uma ação
FloatingActionButton addButton = view.findViewById(R.id.addButton);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Quando for clicado no FAB o método onAddContact será invocado
onAddContact();
}
});
return view;
}

4.2.3 Método onAddContact

O método onAddContact é disparado no toque do botão flutuante de adicionar um novo contato. Esse método deve usar a navegação para solicitar a transição da tela atual para o fragmento addEditFragment. Como se trata de um novo contato, será usada para a passagem de informações (argumentos) as constantes registradas na MainActivity.

private void onAddContact() {
//cria um pacote de argumentos
Bundle arguments = new Bundle();
// adiciona o ID do contato como argumento a ser passado ao fragmento
// como se trate de um novo contato o valor a ser encaminhado será NEW_CONTACT
arguments.putInt(CONTACT_ID, NEW_CONTACT);
//solitica a transição de tela para o fragmento de adicionar um novo contato
Navigation.findNavController(getView()).navigate(R.id.action_mainFragment_to_addEditFragment, arguments);
}

Para invocar uma nova tela, fragmento, usando o componente de arquitetura do Android Jetpack Navigation usamos as ações (action) definidas no grafo de navegação. A ação em questão é a da transição da tela mainFragment para addEditFragment. Além de informar qual ação o navegador deve executar podemos passar argumentos, dados que podem transmitidos de uma tela a outra.

A classe Bundle é um pacote de transmissão de informações entre os fragmentos e atividades que pode também ser utilizada como uma maneira de passar dados de um lado para o outro. No aplicativo da Agenda de Contatos as informações a serem compartilhadas entre as telas são o código único de cada contato. Neste caso específico, o botão adicionar deve enviar um código para o fragmento addEditFragment que sinaliza que se trata de um novo contato a ser inserido. Assim, o novo fragmento ao receber o valor NEW_CONTACT consegue se adaptar a situação de adição de um novo contato e não a edição de um contato já existente. Para fazer o registro de um novo argumento ao pacote (bundle) se usa o método putInt para registrar um número inteiro com a chave CONTACT_ID

4.2.4 Método onContactSelected

O método onContactSelected é disparado no toque de um item da lista de contatos e usa a navegação para solicitar a transição da tela atual para a tela de detalhes, fragmento detailFragment. Esse método será vinculado a lista e operará da seguinte forma, ao se tocar no item da lista de contatos, a lista invoca o método passando como argumento para a função o código do contato selecionado, contactID (o código de um contato é um valor de identificação única usado no banco de dados, similar ao RG das pessoas, só pode haver um), navegador, então, encaminha o código do contato para o fragmento de detalhes, onde será exibido todas as informações do contato selecionado.

// chamado quando o contato é selecionado
private void onContactSelected(int contactID){
//cria um pacote de argumentos
Bundle arguments = new Bundle();
// adiciona o contactID informado como argumento a ser passado ao fragmento
arguments.putInt(CONTACT_ID, contactID);
//solitica a transição de tela para o fragmento de detalhes do contato
Navigation.findNavController(getView()).navigate(R.id.action_mainFragment_to_detailFragment, arguments);
}

4.2.5 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 mainViewModel.

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