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:
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!
@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.
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
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
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