terça-feira, 6 de março de 2012

Hello Android - Parte 2

Olá! Na Parte 1 do tutorial "Hello Android" aprendemos como criar uma Activity (tela), setar seus componentes pelo XML, recuperar e usar esses componentes no código, uma ideia básica de como usar os recursos de string, como setar uma função para um botão e como passar de uma Activity para outra com dados.

Hoje aprenderemos como retornar uma informação de uma Activity chamada para a Activity que a chamou e como usar Toast para exibir  notificações pequenas e não tão importantes.



Vamos re-abrir nosso projeto "Hello Android Tutoriandroid". Se você não tem ele no seu workspace baixe-o aqui, descompacte a pasta na sua pasta workspace, abra o Eclipse, vá em File -> Import -> General/Existing Projects into Workspace, selecione a pasta que você descompactou no workspace e pronto, o projeto estará pronto para ser rodado e editado.

Vamos editar o layout da segunda Activity para que esta mostre 3 botões para o usuário escolher, e ao selecionado a Activity é termina e diz para Activity anterior qual botão foi escolhido e esta deve tratar essa escolha. Abra o activity_mostrar_nome.xml em res/layout/, que atualmente está bem simples, e vamos altera-lo para deixar deste jeito:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
   
 <TextView android:id="@+id/text_hello"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>
 
 <Button android:id="@+id/bt_escolha1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/escolha1"/>
 
 <Button android:id="@+id/bt_escolha2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/escolha2"/>
 
 <Button android:id="@+id/bt_escolha3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/escolha3"/>
 
</LinearLayout>
O que fizemos foi apenas adicionar os 3 botões mesmo, precisamos também adicionar as strings referentes aos textos dos botões. Adicionaremos isto em res/values/strings.xml (antes do fechamento da tag </resources>):
    <string name="escolha1">Escolha 1</string>
    <string name="escolha2">Escolha 2</string>
    <string name="escolha3">Escolha 3</string>
Agora nossos botões já são exibidos na segunda tela:

Mas ainda não possuem nenhuma ação. Vamos então dar vida a esses botões. Primeiramente vamos mudar a forma que chamamos a segunda Activity, pois da atual forma apenas chamamos a Activity e não esperamos por nenhum retorno, mas agora precisamos avisar que queremos e esperamos um retorno da Activity seguinte. Abra a classe da primeira Activity HelloAndroidTutoriandroidActivity.java em src/com.tutoriandroid.helloandroid/ e alteraremos a linha de comando:
startActivity(i);
Para:
startActivityForResult(i, ESCOLHER_BOTAO);
E adicionaremos a constante na nossa classe (basta adicionar esta linha após a abertura da classe):
public static final int ESCOLHER_BOTAO = 1;
O que fizemos foi dizer que queremos iniciar a Activity definida pela intent i e estamos executando a ação ESCOLHER_BOTAO (que é definida por um inteiro qualquer, mas é uma boa prática usar constantes para evitar falhas) e esperamos por um resultado. Ainda não implementamos o que fazer com o resultado, mas vamos por partes. Vamos agora adicionar as ações dos botões. Abra o MostrarNomeActivity.java e faça as mudanças e deixe o código assim:
public class MostrarNomeActivity extends Activity {
TextView nomeText;
Button escolhaButtons[] = new Button[3];
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mostrar_nome);
        
        nomeText = (TextView) findViewById(R.id.text_hello);
        escolhaButtons[0] = (Button) findViewById(R.id.bt_escolha1);
        escolhaButtons[1] = (Button) findViewById(R.id.bt_escolha2);
        escolhaButtons[2] = (Button) findViewById(R.id.bt_escolha3);
        
        for(int i = 0; i < 3; i++)
        escolhaButtons[i].setOnClickListener(pegarAcao(i+1));
        
        Intent i = getIntent();
        String nome = i.getStringExtra("NOME");
        nomeText.setText(nome);
    }
    
    private View.OnClickListener pegarAcao(final int numero){
    return new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent data = new Intent();
data.putExtra("ESCOLHA", numero);
setResult(RESULT_OK, data);
finish();
}
};
    }
}
Importe o que for necessário. O que fizemos foi apenas criar um array com 3 Buttons, associa-los aos Buttons definidos no XML e criar suas ações. Como a ação deles serão as mesmas apenas mudando o número da escolha, fiz de um jeito que não precisa digitar cada ação separadamente, basta usar a função pegarAcao com o número da escolha como parâmetro. Na ação dos botões apenas criamos uma Intent que apenas servirá para levar a informação de qual botão foi escolhido, através do data.putExtra("ESCOLHA", numero), definimos o resultado como OK (deu tudo certo) e definimos a Intent que esta nossa informação e em seguinte finalizamos a Activity com o finish (que tem a mesma função do botão 'voltar' dos aparelhos Android).

Agora precisamos pegar essa informação e exibir essa escolha para o usuário. Voltemos então para o HelloAndroidTutoriandroidActivity.java e adicionaremos o seguinte método na classe (apenas coloque esse código logo antes do ultimo '{'):
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode == RESULT_OK && requestCode == ESCOLHER_BOTAO){
    int escolha = data.getIntExtra("ESCOLHA", 0);
    Toast.makeText(this, getString(R.string.escolheu) + " " + escolha, Toast.LENGTH_SHORT).show();
    }
    super.onActivityResult(requestCode, resultCode, data);
    }
Crie uma string em strings.xml (você já deve saber como fazer isto) com nome escolheu e o texto: "Você escolheu a opção número", que será exibido no Toast.

Esse método é executado sempre que uma Activity que foi chamada pelo startActivityForResult é finalizada. Ele tem como parâmetros o resquestCode que usamos para chamar a Activity(no nosso caso ESCOLHER_BOTAO), resultCode que é o resultado definido pela Activity chamada que pode ser uma das contantes da própria classe Activity (como RESULT_OK, por exemplo) ou um inteiro definido por você, e uma Intent carregando os dados.

O que fizemos foi verificar se o resultado está OK, ou seja, se um botão foi clicado, e se a ação requisitada foi de ESCOLHER_BOTAO. Se sim, pegamos a escolha pela Intent data e exibimos um pequeno aviso através do Toast, definindo o texto a ser exibido e a duração (que deve ser uma constante da Toast). Vale avisar que Toast deve ser usada apenas para notificações não muito importantes, e que não precisem de ação. Para outras notificações deve-se usar a Notification que é apresentada na barra de notificações e pode ser bem controlada, com ações e atualizações associadas a ela.

Pronto, agora você já sabe como retornar uma informação de uma Activity chamada para outra. Como aplicar isso em aplicativos reais? Por exemplo: você pode ter uma lista de alguma coisa no seu aplicativo, e uma Activity você precisa selecionar um item desta lista e retornar para a Activity. A seguir imagens do nosso projeto:


Baixe o projeto completo aqui.

5 comentários:

André Schefer Moleiro at 21 de fevereiro de 2013 às 01:38 disse...

Amigo, apenas uma dica: na linha

Toast.makeText(this, getString(R.string.escolheu) + " " + escolha, Toast.LENGTH_SHORT).show();

seria melhor trocar o this por "MainActivity(ou o nome da Activity).this" no primeiro parâmetro.

Aqui pelo menos esse "this" ele entendeu como o métoco onActivityResult, o que acabou causando um erro.

Muito obrigado por compartilhar todo esse conhecimento no blog, espero mais postagens!

Gustavo Carvalho at 21 de fevereiro de 2013 às 15:04 disse...

@André: Isso só é um problema se utilizar dentro de algum outro objeto (anônimo ou inner object) e no cenário descrito não deve dar problemas. Mas realmente, da forma que você indicou funcionaria em qualquer cenário que o nome da Activity for MainActivity e talvez seja melhor sempre escrever assim mesmo.

Anônimo at 1 de agosto de 2013 às 01:34 disse...

Amigo, eu to desenvolvendo um app, cuja funcionalidade é leitura, entao eu criei com metodo SLIDING DRAWER como sendo menu1 para escolha do capitulo. Quando o usuario escolher o capitulo 1, vai ter n paginas, com metodo de Zoomage e ViewPager ou seja, primeira pagina vai ter imagens e metodo para mover de pagina com o onTouch. Ok, o problema é que eu quero fazer uma solução para menu de paginas, entao criei um slidingDrawer horizontal com button de pagina. Só que lá no metodo onClick coloquei assim:

switch(view.getid()){
case R.id.pagina1:
setContentview(R.menu.pagina1);
ZoomImage();
ViewPager();
break;
}

porem, toda vez que eu clico ele nao executa todos os metodos apenas o ViewPager().
quando eu movo o setContentView pra debaixo do ViewPager, ele vai para o selecionado porem nao funciona o metodo ZoomPage() e nem o ViewPager().

me da um help que uma coisa simples dessa ta complicado.

Agradeço

Frederico Brigatte at 15 de setembro de 2013 às 20:32 disse...

Como fazer para a activity receber parametros de duas activities diferentes?
Eu fiz assim:

Intent it = getIntent();
ID = it.getIntExtra(“codigo”, 1);

if (it != null){
int msg = it.getIntExtra(“codigo”,1);
Toast.makeText(getBaseContext(), “Valor ID Cliente ” + msg, Toast.LENGTH_LONG).show();
}
Se faço para mais uma, da erro de nullpointerexception

Anônimo at 7 de novembro de 2013 às 11:55 disse...

Oi estou com erro na linha:
Toast.makeText(MostrarNomeActivity.this, getString(R.string.escolheu) + " " + escolha, Toast.LENGTH_SHORT).show();
Aparece o erro:
The method onActivityResult(int, int, Intent) is undefined for the type Object
Poderia me ajudar?

Postar um comentário

 
© 2011 Tutoriandroid | Recode by Ardhiansyam | Based on Android Developers Blog