A navegação entre telas/páginas é uma necessidade comum da maioria das aplicações, sejam elas mobile, web ou desktop. No Android as telas da aplicação são representadas por activities e a navegação entre elas é feita principalmente usando as classes Intent e Bundle, como veremos a seguir.
Navegação básica
No Android a navegação entre activities é feita por meio da classe Intent, que representa uma ação a ser realizada (neste caso a navegação). Essa classe recebe em seu construtor as activities de origem e destino e em seguida devemos invocar o método startActivity da activity, passando a instância de Intent como parâmetro, como ilustra a Figura 1.
Abaixo temos o código com o qual fazemos essa navegação:
Intent in = new Intent(LoginActivity.this, HomeActivity.class);
startActivity(in);
Esse código pode estar, por exemplo, no clique de um botão da LoginActivty a fim de navegar para a HomeActivity.
Navegação com passagem de parâmetros
É muito comum que ao navegarmos entre duas activities no Android seja necessário trafegar dados entre elas. Para isso utilizamos a classe Bundle, que irá encapsular as informações que queremos transportar entre as activities a “anexamos” ao nosso Intent, como ilustra a sequência de imagens a seguir:
2)Instância da classe Bundle - Bundle bundle = new Bundle();
3) Adicionar o dado no bundle - bundle.putString("email", email);
4) Criar o intent para a navegação entre as telas: Intent in = new Intent(LoginActivity.this, HomeActivity.class);
5) Adicionar ao bundle ao intent - in.putExtras(bundle); 6) Executar a ação de navegação - startActivity(in);
Recuperar dados enviados por parâmetro> 1) Recuperar os dados bundle através do Intent - Bundle bundle = getIntent().getExtras();
2) Obter o dado armazenado como texto no bundle a partir do seu identificador ("email") - String email = bundle.getString("email");
3) Exibir o dado na tela - mensagem.setText("Olá " + email);
Abaixo temos o código que faz isso:
public void entrar(View v){
String emailUser = email.getText().toString();
Bundle bundle = new Bundle();
bundle.putString("email", emailUser);
Intent in = new Intent(LoginActivity.this, HomeActivity.class);
in.putExtras(bundle);
startActivity(in);
}
Linha 2: Capturamos o texto digitado no campo, e que deve ser passado para a segunda activity;
Linha 3: Instanciamos a classe Bundle, que conterá os dados a serem trafegados;
Linha 4: Adicionamos a variável string no bundle usando o método putString. Note que o dado é identificado pela chave "email";
Linha 5: Instanciamos a classe Intent, que representa a ação de navegação entre as duas activities;
Linha 6: Adicionamos o bundle no intent, assim os dados trafegarão para a segunda activity;
Linha 7: Executamos a ação de navegação propriamente dita.
Agora, na activity de destino precisamos obter o Bundle enviado pelo Intent para recuperar o e-mail que foi digitado pelo usuário e exibi-lo na HomeActivity. Para isso, no método onCreate da HomeActivity, capturamos o Bundle através do método getIntent().getExtras() que irá obter as informações que foram enviadas através do Intent. E com o método getString da classe Bundle, passando a chave “email”, conseguimos recuperar a informação que foi inserida na LoginActivity. Após isso, é só exibir o e-mail recuperado, como vemos no código abaixo:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mensagem = (TextView) findViewById(R.id.textMensagem);
Bundle bundle = getIntent().getExtras();
String data = bundle.getString("email");
mensagem.setText("Olá " + data);
}
Linha 4: Capturamos o componente que irá exibir o e-mail do usuário e atribuimos à variável mensagem;
Linha 5: Capturamos o bundle enviado através do Intent e salvamos na variável bundle;
Linha 6: Recuperamos o conteúdo que possui a chave “email” e atribuímos à variável data;
Linha 7: Adicionamos o email do usuário, enviado através do bundle, no conteúdo da mensagem da nossa Activity.
Trafegando outros tipos de dados
De forma semelhante ao que fizemos para enviar uma string, podemos trafegar outros tipos de dado através do Bundle. Para isso, basta “anexar” um outro dado utilizando o método “put” referente a ele, como podemos ver na tabela abaixo:
Tipo de Dado | Método |
Integer | putInt(chave, valor) |
Char | putChar(chave, valor) |
Float | putFloat(chave, valor) |
Boolean | putBoolean(chave, valor) |
No código abaixo temos exemplos de uso desses métodos:
bundle.putInt("idade", 22);
bundle.putBoolean("status", true);
bundle.putChar("sexo", 'M');
bundle.putFloat("salario", 2500);
Já para capturar esses valores devemos usar os métodos get referentes ao tipo de dado que estamos recebendo através do Bundle, como podemos ver na tabela abaixo:
Tipo de Dado | Método |
Integer | getInt(chave) |
Char | getChar(chave) |
Float | getFloat(chave) |
Boolean | getBoolean(chave) |
Abaixo temos exemplos de uso dessas funções:
int idade = bundle.getInt("idade");
boolean status = bundle.getBoolean("status");
char sexo = bundle.getChar("sexo");
float salario = bundle.getFloat("salario");
Trafegando objetos
Instanciar e preencher o objeto a ser enviado - Pessoa p = new Pessoa("João", "M", 22);
Intent in = new Intent(ActivityOrigem.this, ActiviyDestino.class);
Adicionar o objeto no Intent com o método putExtra - in.putExtra("pessoa", p);
startActivity(in);
É necessário fazer o cast explícito (Pessoa) e recuperar o objeto Pessoa do Intent - Pessoa p = (Pessoa)getIntent().getSerializableExtra("pessoa")
Para enviar um objeto como parâmetro entre activities precisamos adicioná-lo diretamente ao Intent utilizando o método putExtra, como podemos ver abaixo:
Pessoa p = new Pessoa(emailUser, 22, 'M', 2500, true);
Intent in = new Intent(LoginActivity.this, HomeActivity.class);
in.putExtra("pessoa", p);
Linha 1: Criamos o objeto do tipo Pessoa passando seus atributos no construtor;
Linha 3: Utilizando o método putExtra criamos uma estrutura do tipo chave-valor onde a chave “pessoa” irá identificar o objeto que estamos passando como parâmetro através da nossa navegação.
É importante ressaltar que a classe Pessoa precisa implementar a interface Serializable para que seja possível enviá-la através da navegação:
public class Pessoa implements Serializable {
private String email;
private int idade;
private char sexo;
private float salario;
private boolean status;
//construtor e métodos get e set
E para recuperar esse objeto e exibir suas informações na HomeActivity utilizamos o método getSerializableExtra, passando a chave que o identifica, como podemos ver abaixo:
Pessoa p = (Pessoa) getIntent().getSerializableExtra("pessoa");