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:
|