Intent - Retornando valor (onActivityResult)

Top  Previous  Next

Definição

 

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.

No exemplo vamos fazer 2 telas, ao abrir a tela 2 e retornar para 1 será exibido o que foi selecionado.

Tela 1

 

Tela 2

 

Fonte da tela:  main.xml

 

<?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"

  android:paddingBottom="10sp"

  android:paddingLeft="10sp"

  android:paddingRight="10sp"

  android:paddingTop="10sp" >

 

  <TextView

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:gravity="center"

      android:text="Tela inicial clique no botão para ver o aplicativo."

      android:textSize="20sp" />

 

  <Button

      android:id="@+id/btnStart"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="Iniciar "

      android:textSize="20sp" />

 

</LinearLayout>

 

Fonte da tela: janela2.xml

 

<?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"

  android:paddingBottom="12sp"

  android:paddingLeft="12sp"

  android:paddingRight="12sp"

  android:paddingTop="12sp" >

 

  <TextView

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:gravity="center"

      android:text="Escolha uma opção para ver o Resultado"

      android:textColor="#ffffff"

      android:textSize="20sp" />

 

  <RadioGroup

      android:id="@+id/rgOpcoes"

      android:layout_width="wrap_content"

      android:layout_height="wrap_content" >

 

      <RadioButton

          android:id="@+id/rg1"

          android:layout_width="wrap_content"

          android:layout_height="wrap_content"

          android:checked="true"

          android:text="Primeira Opção"

          android:textColor="#ffffff"

          android:textSize="20sp" />

 

      <RadioButton

          android:id="@+id/rg2"

          android:layout_width="wrap_content"

          android:layout_height="wrap_content"

          android:text="Segunda Opção"

          android:textColor="#ffffff"

          android:textSize="20sp" />

  </RadioGroup>

 

  <Button

      android:id="@+id/btnOk"

      android:layout_width="fill_parent"

      android:layout_height="wrap_content"

      android:text="Clique para exibir a mensagem"

      android:textSize="18sp" />

 

</LinearLayout>

 

Fonte da primeira Activity (principal)

 

package com.junior.janelas;

 

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

 

public class JanelasIdentityActivity extends Activity {

 

 private static final int Activity_UM_DOIS = 1;

 Button BtnStart;

 

 @Override

 public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         setContentView(R.layout.main);

 

         // associa o botão

         BtnStart = (Button) findViewById(R.id.btnStart);

         

         // chama o click do botao

         BtnStart.setOnClickListener(new View.OnClickListener() {

                 public void onClick(View view) {

                         

                         // cria um Intent e diz que o pai sou eu mesmo e o filho é o TelaDois

                         Intent myIntent = new Intent(JanelasIdentityActivity.this, TelaDois.class);

                         

                         // chama esse intent e aguarda resultado

                         startActivityForResult(myIntent, Activity_UM_DOIS);

                 }

         });

 }

 

 protected void onActivityResult(int codigo, int resultado, Intent i) {

         // se o resultado de uma Activity for Activity_UM_DOIS...

         if (codigo == Activity_UM_DOIS) {

                 

                 // se o "i" (Intent) estiver preenchido, pega os seus dados (getExtras())

                 Bundle params = i != null ? i.getExtras() : null;

 

                 if (params != null) {

                         String msg = params.getString("msg");

                         if (resultado == 1) {

                                 // mostra hint

                                 Toast.makeText(this, "Escolhida: " + msg, Toast.LENGTH_LONG).show();

                         } else if (resultado == 2) {

                                 Toast.makeText(this, "Escolhida: " + msg, Toast.LENGTH_LONG).show();

                         }

                 }

         }

 }

}

 

Fonte da segunda Activity

 

package com.junior.janelas;

 

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.RadioGroup;

 

public class TelaDois extends Activity {

 

 Button btnOk;

 RadioGroup rgOpcoes;

 

 @Override

 public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

         setContentView(R.layout.janela2);

 

         // associa o botao e seu click

         btnOk = (Button) findViewById(R.id.btnOk);

         btnOk.setOnClickListener(new View.OnClickListener() {

 

                 public void onClick(View v) {

                         rgOpcoes = (RadioGroup) findViewById(R.id.rgOpcoes);

 

                         // pega o radio checked

                         int rg = rgOpcoes.getCheckedRadioButtonId();

 

                         // em ambos casos criar um Intent e adiciona um string nele (putExtra) e seta o Result

                         if (rg == R.id.rg1) {

                                 Intent i = new Intent();

                                 i.putExtra("msg", "1º Opção:");

                                 setResult(1, i);

 

                         } else if (rg == R.id.rg2) {

 

                                 Intent i = new Intent();

                                 i.putExtra("msg", "2º opção");

                                 setResult(2, i);

                         }

                         

                         // importante para voltar a primeira Activity pai

                         finish();

                 };

         });

 }

}

 

Importante! AndroidManifest.xml

 

Precisa declarar a segunda activity no manifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

  package="com.junior.janelas"

  android:versionCode="1"

  android:versionName="1.0" >

 

  <uses-sdk android:minSdkVersion="7" />

 

  <application

      android:icon="@drawable/ic_launcher"

      android:label="@string/app_name" >

      <activity

          android:name=".JanelasIdentityActivity"

          android:label="@string/app_name" >

          <intent-filter>

              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />

          </intent-filter>

      </activity>

      <activity

            android:name=".TelaDois"

            android:label="@string/app_name" />

  </application>

 

</manifest>

 

Como funciona

 

Ao clicar no botão "Iniciar" da primeira Activity, a segunda é chamada e ao selecionar um radio da segunda e clicar no botão, é criada uma instancia de Intent que é retornado para primeira Activity.

O resultado é exibido num Toast: