Technè

Tecnologia & Experiência do Usuário no C.E.S.A.R

Android: Activity e interação entre Activities

Posted by Felipe Ferraz On janeiro - 13 - 2011

* Este post foi redigido pela equipe C.E.S.A.R. Sorocaba

Ao desenvolver uma aplicação para Android, devemos estar familiarizados com alguns conceitos básicos relacionados à sua estrutura. Entre eles, podemos citar dois componentes essenciais para toda aplicação: as activities e os intents.

Uma Activity é uma classe Java que herda da classe Activity do pacote Android. Ela define a tela que irá interagir com um usuário de Android. Para desenvolver qualquer aplicação com interface em Android é necessário que se tenha ao menos uma Activity.

É importante ressaltar que a Activity é apenas a tela exibida, sem nenhum layout. Geralmente, para adicionarmos conteúdo nas activies, devemos utilizar os arquivos xml de layout do Android, nos quais definem-se todos os elementos visuais, tais como botões e imagens.

Aqui descreveremos uma utilização básica de Activity onde uma primeira Activity (Tela principal) chama outra Activity e esta retorna um valor para a primeira.

Inicialmente é preciso criar um novo projeto Android, com um nome de sua preferência.

Aqui estamos usando Android 2.2.

Depois a classe Primeiro será criada e o xml main.xml (em res->;layout) contendo os elementos que serão apresentados ao usuário, inicialmente apenas um texto.
Alteramos então o main.xml adicionando um botão.

main.xml
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>

<Button
android:id=”@+id/botao”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/botao” />

<TextView
android:id=”@+id/textoMain”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>

</LinearLayout>

Dessa forma temos na tela um botão com Id botao, que podemos acessar do Activity pelo método findViewById(Id) e um texto que exibirá nosso resultado.

Podemos então criar uma segunda Activity, com nome Segundo. Basta criar uma nova classe no seu pacote, que herde da classe Activity.

E podemos criar um novo xml para representar a tela dessa segunda Activity. Basta adicionar um novo arquivo Android XML em layout.

Obs: Os nomes dos recursos devem ser escritos em caracteres minúsculos.

Nesse xml adicionaremos um campo para o usuário escrever seu nome e um botão.

<LinearLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”>

<EditText
android:id=”@+id/texto”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/texto”
/>

<Button android:text=”@string/botao2″
android:id=”@+id/botao2″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”/>
</LinearLayout>

Agora que temos as duas telas prontas podemos fazer as duas se comunicarem.
Na Activity Primeiro, dentro do método onCreate e após a chamada de setContentView, criamos uma variável para acessar o botão criado na tela com o id botao.

1
Button botao = (Button) findViewById(R.id.botao);

Note que estamos recuperando o id do botão através da classe R, que é gerada pelo Eclipse sempre que alteramos algum recurso do projeto. Esta classe é responsável por mapear estes recursos, permitindo assim o seu acesso.

Adicionamos então um Listener ao botão para controlarmos a ação que ocorrerá quando o usuário clicar nele.

1
2
3
4
5
6
botao.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(Primeiro.this, Segundo.class);
startActivityForResult(i, 1);
}
});

A classe Intent permite que realizemos a comunicação entre duas Activities passando diferentes tipos de informações. Tais informações podem ser quaisquer tipos primitivos de Java e objetos de classes serializáveis. Precisamos apenas informar a instância da Activity inicial e o tipo da que será chamada.
Existem vários métodos que iniciam activities, mas nesse caso é importante utilizar o método startActivityForResult, pois este permite capturar resultados fornecidos pela Activity chamada. Esse método irá criar a nova Activity (no caso a Segundo) e esperará um retorno assim que essa for encerrada. Além disso, passamos um código de requisição à segunda Activity , de acordo com a necessidade da aplicação.

Para receber o retorno da segunda Activity precisamos sobrescrever o método onActivityResult da classe Activity.

1
2
3
4
5
public void onActivityResult(int requestCode, int resultCode,
Intent data) {
TextView t = (TextView) findViewById(R.id.textoMain);
t.setText(data.getExtras().getString("valor"));
}

O objeto t é o texto que será exibido na tela. O valor recuperado em data.getExtras().getString(“valor”) é o retorno da segunda Activity, que é passado pelo Intent data.

A segunda Activity deve recuperar o valor que o usuário digitar e enviar a primeira Activity.

1
Button botao = (Button) findViewById(R.id.botao2);
1
botao.setOnClickListener(new View.OnClickListener() {
1
2
3
4
public void onClick(View v) {
Intent data = new Intent();
data.putExtra("valor", ((EditText)findViewById(R.id.texto)).getText().toString());
setResult(2, data);
1
 
1
2
3
 finish();
}
});

Como na primeira acessamos o botão com um Listener e criamos um Intent para enviar a resposta a primeira Activity. Usamos o método putExtra para adicionar o texto digitado com um chave “valor”, que será acessada na primeira Activity. E chamamos o setResult para adicionar o Intent como resultado dessa Activity. E finalizamos a Activity com finish.

Para acessar aplicativos nativos do Android como a lista de contatos também podemos usar o Intent, da seguinte forma:
Declaramos:

1
static final int PICK_CONTACT_REQUEST = 0;

E no onClick do botao temos:

1
2
3
4
5
6
public void onClick(View v) {
startActivityForResult(
new Intent(Intent.ACTION_PICK,
android.provider.ContactsContract.Contacts.CONTENT_URI),
PICK_CONTACT_REQUEST);
}

Nesse caso instanciamos o Intent com uma ação de “escolha” ( Intent.ACTION_PICK) para o usuário selecionar um contato, a URI para acessar a lista de contatos (android.provider.ContactsContract.Contacts.CONTENT_URI) e código de requisição para identificar a operação (PICK_CONTACT_REQUEST).

E para exibir os dados do contato selecionado ao receber a resposta inicial podemos escrever o método onActivityResult dessa forma:

1
2
3
4
5
if (requestCode == PICK_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
startActivity(new Intent(Intent.ACTION_VIEW, data.getData()));
}
}

Chamando uma outra Activity que exibe os dados do contato escolhido passados em uma URI que retorna no Intent em data.getData().

Categorias: Geral

One Response to “Android: Activity e interação entre Activities”

  1. [...] Nota: O método abaixo deve fazer parte de uma Activity onde será chamado. Mais informações sobre Activities aqui. [...]

Leave a Reply