Diferencia entre revisiones de «Intents explícitos»
Ir a la navegación
Ir a la búsqueda
(No se muestran 2 ediciones intermedias del mismo usuario) | |||
Línea 723: | Línea 723: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
*'''Liña 50''': Nesta ocasión co método '''setClassName(String packageName, String className)''' indicámoslle no nome do paquete que contén a clase e nome da clase. | *'''Liña 50''': Nesta ocasión co método '''setClassName(String packageName, String className)''' indicámoslle no nome do paquete que contén a clase e nome da clase. | ||
+ | |||
+ | |||
+ | <br /> | ||
+ | ==Paso de datos complexos dunha activity a outra== | ||
+ | |||
+ | * Nos exemplos anteriores estamos a pasar datos de tipo String dunha activity a outra. | ||
+ | |||
+ | * Pero tamén podemos facer uso da clase Bundle, como xa vimos [http://wiki.cifprodolfoucha.es/index.php?title=Ciclo_de_vida_dunha_aplicaci%C3%B3n#Recrear_unha_actividade:_gardar_e_recuperar_o_seu_estado no ciclo de vida das Activities]. | ||
+ | : Para iso temos que chamar ao [https://developer.android.com/reference/android/content/Intent.html#putExtras(android.os.Bundle) método putExtras] da clase Intent desta forma: | ||
+ | |||
+ | |||
+ | <syntaxhighlight lang="java" line highlight=""> | ||
+ | Intent intent = new Intent(this,Activity_Chamar.class); | ||
+ | |||
+ | Bundle datos = new Bundle(); | ||
+ | datos.putString("VARIABLE1",VALOR1); | ||
+ | datos.putInt("VARIABLE2",VALOR2); | ||
+ | ............. | ||
+ | intent.putExtras(datos); | ||
+ | |||
+ | startActivity(intent); | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | * Para recuperar os datos na activity 'destino' facemos o proceso contrario: | ||
+ | <syntaxhighlight lang="java" line highlight=""> | ||
+ | @Override | ||
+ | protected void onCreate(Bundle savedInstanceState) { | ||
+ | super.onCreate(savedInstanceState); | ||
+ | setContentView(R.layout.activity_ud03_01__a2__intents); | ||
+ | |||
+ | Intent intent = getIntent(); | ||
+ | Bundle datos = intent.getExtras(); | ||
+ | String valor1 = datos.getString("VARIABLE1"); | ||
+ | |||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | :'''<u>NOTA IMPORTANTE:</u>''' Lembrar que se gardades o contido dun View (por exemplo, o EditText) o contido a gardar será: editText.getText().'''toString()''' | ||
+ | : Tedes que facer uso do método 'toString()'. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <br /> | ||
+ | * Se queremos pasar obxectos pertencentes a clases complexas dunha activity a outra, teremos que facer uso da [https://developer.android.com/reference/android/os/Parcelable interface Parceleable] a cal deberemos implementar na clase que queremos utilizar para pasar os datos. | ||
+ | : Tedes un exemplo completo de uso [http://androcode.es/2012/12/trabajando-con-parcelables/ neste enlace]. | ||
+ | |||
+ | |||
+ | |||
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2015). | <br> -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2015). |
Revisión del 17:26 20 oct 2018
Sumario
- 1 Intents explícitos
- 2 Caso Práctico 1: Lanzar unha segunda Activity propia da aplicación
- 3 Continuación caso Práctico 1: Pasar datos da actividade secundaria á principal
- 4 Continuación caso práctico 1: Chamar a unha activity doutra aplicación: á calculadora
- 5 Paso de datos complexos dunha activity a outra
Intents explícitos
- Como comentamos anteriormente os intents explícitos son a forma que temos de 'chamar', ou sexa 'abrir' outra activity polo seu nome.
- O seu nome está definido no arquivo AndroidManifiest.xml pero se estamos nun proxecto e queremos chamar a activities definidas dentro do mesmo, tamén podemos facer uso do nome da clase da forma: NomeClaseActivity.class (o veremos nos exemplos).
- Imos comezar usando os Intents de forma explícita, primeiro chamando a unha segunda activity que imos crear nós e logo chamando á calculadora.
- Finalmente chamaremos a distintas activities, como contactos, navegador web, etc de forma implícita.
- En calquera dos casos imos pasar información entre as Activities, ben dende a que chama á chamada, como viceversa.
- Como indicamos imos comezar creando unha Aplicación con 2 Activities: unha principal e outra secundaria.
- Logo lanzaremos a calculadora do sistema.
Caso Práctico 1: Lanzar unha segunda Activity propia da aplicación
- Partimos que xa temos creado o proxecto inicial como xa indicamos anteriormente.
- Se non o temos creado antes, crearemos un novo paquete de nome: Intents como un subpaquete do teu paquete principal.
- Dentro do paquete Intents crear unha nova 'Empty Activity' de nome: UD03_01_Intents de tipo Launcher e sen compatibilidade.
- Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.
- Dentro do paquete Intents crear unha nova 'Empty Activity' de nome: UD03_01_Segunda_Intents no Launcher e sen compatibilidade.
- Modifica o arquivo AndroidManifiest.xml e engade unha label á activity como xa vimos na creación do proxecto base.
- Como xa comentamos anteriormente ao desmarcar a opción Launcher leva consigo que no arquivo AndroidManifiest.xml non se cre sección 'Intent-filter' como vemos na seguinte imaxe:
- Esta práctica vai constar de dúas activities na que unha delas chamará a outra:
Dende a pantalla principal vaise introducir un nome. Cando se prema o botón chamarase á segunda acivity que recibira o valor do cadro de texto. Ademais nesta primeira pantalla temos a opción de destruír esa activity no momento de chamar á segunda.
Aconséllase experimentar con esa opción e usar o botón Back unha vez que se está na segunda Activity.
O XML do layout da Activity principal
1 <?xml version="1.0" encoding="utf-8"?>
2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".Intents.UD03_01_A1_Intents">
8
9 <TextView
10 android:id="@+id/tvNome_UD03_01_A1_Intent"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_marginStart="8dp"
14 android:layout_marginTop="8dp"
15 android:text="Dime o teu nome:"
16 android:textSize="18sp"
17 app:layout_constraintStart_toStartOf="parent"
18 app:layout_constraintTop_toTopOf="@+id/etNome_UD03_01_A1_Intents" />
19
20 <EditText
21 android:id="@+id/etNome_UD03_01_A1_Intents"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:layout_marginStart="8dp"
25 android:layout_marginTop="8dp"
26 android:ems="10"
27 android:inputType="textPersonName"
28 android:hint="Nome a enviar"
29 app:layout_constraintStart_toEndOf="@+id/tvNome_UD03_01_A1_Intent"
30 app:layout_constraintTop_toTopOf="parent" />
31
32 <CheckBox
33 android:id="@+id/ckDestruir_UD03_01_A1_Intents"
34 android:layout_width="wrap_content"
35 android:layout_height="wrap_content"
36 android:layout_marginEnd="8dp"
37 android:layout_marginStart="8dp"
38 android:layout_marginTop="48dp"
39 android:text="Destruír esta activity ao chamar á segunda"
40 android:textSize="14sp"
41 app:layout_constraintEnd_toEndOf="parent"
42 app:layout_constraintStart_toStartOf="parent"
43 app:layout_constraintTop_toBottomOf="@+id/etNome_UD03_01_A1_Intents" />
44
45 <Button
46 android:id="@+id/btnLanzar_UD03_01_A1_Intent"
47 android:layout_width="0dp"
48 android:layout_height="wrap_content"
49 android:layout_marginEnd="8dp"
50 android:layout_marginStart="8dp"
51 android:layout_marginTop="16dp"
52 android:text="Chamar 2ª Activity: Recibir Datos"
53 app:layout_constraintEnd_toEndOf="parent"
54 app:layout_constraintStart_toStartOf="parent"
55 app:layout_constraintTop_toBottomOf="@+id/ckDestruir_UD03_01_A1_Intents" />
56 </android.support.constraint.ConstraintLayout>
A clase Java a activity principal
1 package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.CheckBox;
9 import android.widget.EditText;
10 import android.widget.Toast;
11
12 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
13
14 public class UD03_01_A1_Intents extends Activity {
15
16 public final static String NOME = "nome"; // É o nome da variable
17
18 private void xestionarEventos(){
19
20 Button btnLanzarActivity = findViewById(R.id.btnLanzar_UD03_01_A1_Intent);
21 btnLanzarActivity.setOnClickListener(new View.OnClickListener() {
22 @Override
23 public void onClick(View v) {
24 CheckBox chkDestruir = findViewById(R.id.ckDestruir_UD03_01_A1_Intents);
25 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
26
27 Intent intent = new Intent(getApplicationContext(), UD03_01_A2_Intents.class);
28 intent.putExtra(NOME, etNome.getText().toString());
29
30 startActivity(intent);
31
32 if (chkDestruir.isChecked()) {
33 finish();
34 }
35 }
36
37 });
38
39 }
40
41 public void finish() {
42 super.finish();
43 Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
44 }
45
46 @Override
47 protected void onCreate(Bundle savedInstanceState) {
48 super.onCreate(savedInstanceState);
49 setContentView(R.layout.activity_ud03_01__a1_intents);
50
51 xestionarEventos();
52 }
53 }
- Liña 14: Definimos unha constante de tipo String, chamada NOME. Observar que é pública. Isto o facemos para que dende a segunda activity poida acceder a ela. O obxectivo é que o nome do parámetro que estamos a utilizar para enviar o dato, nos aseguremos que sexa o mesmo.
- Liña 27: Creamos un obxecto de tipo Intent. O construtor recibe 2 parámetros:
- O primeiro parámetro é unha referencia ao contexto. Non podemos poñer 'this' xa que estamos dentro dunha clase anónima e por tanto this non é a activity. Por iso poñemos getApplicationContext()
- O segundo parámetro é a clase que o sistema ‘intentará’ cargar (no noso caso o nome da clase asociada á Activity que desexamos cargar).
- Liña 28: Asignamos ao intent un par CHAVE-VALOR a través do método putExtra(). Neste caso un valor String a través de NOME, definido na liña 14.
- Tamén poderíamos non usar a constante: intent.putExtra("nome", etNome.getText().toString())
- Liña 30: Lanzamos a Activity
- Liña 32-34: Se o CheckBox do Layout está marcado entón destruímos esta Activity:
- Realizar probas marcando e desmarcando esta marca e premendo despois o botón Back da Segunda Activity..
Nota: Indicar que tamén podemos lanzar a segunda activity con este código:
1 Intent intent = new Intent(); 2 intent.setClassName("es.cursoandroid.cifprodolfoucha.aprendiendo","es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents");
- Sendo 'es.cursoandroid.cifprodolfoucha.aprendiendo' o nome do paquete definido no AndroidManifiest.xml e 'es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents' o nome do paquete xunto có nome da Activity tamén definido no AndroidManifiest.xml.
- Ou con este outro:
1 intent.setClassName(getApplicationContext(),"es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents");
- Sendo o primeiro parámetro unha referencia ao contexto e o segundo o nome da clase.
- Os datos anteriores os obtemos do AndroidManifiest.xml:
- O veremos máis adiante neste punto da Wiki, como chamar a outras aplicacións instaladas no S.O. Android empregando esta forma.
O XML da Activity que recibe a chamada
1 <?xml version="1.0" encoding="utf-8"?>
2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".Intents.UD03_01_A2_Intents">
8
9 <TextView
10 android:id="@+id/tvResultado_UD03_01_A2_Intent"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_marginEnd="8dp"
14 android:layout_marginStart="8dp"
15 android:layout_marginTop="8dp"
16 android:contentDescription="Nome enviado"
17 android:text="Resultado"
18 app:layout_constraintEnd_toEndOf="parent"
19 app:layout_constraintStart_toStartOf="parent"
20 app:layout_constraintTop_toTopOf="parent" />
21
22 <Button
23 android:id="@+id/btnPechar_UD03_01_A2_Intent"
24 android:layout_width="wrap_content"
25 android:layout_height="wrap_content"
26 android:layout_marginEnd="8dp"
27 android:layout_marginStart="8dp"
28 android:layout_marginTop="24dp"
29 android:text="Pechar"
30 app:layout_constraintEnd_toEndOf="parent"
31 app:layout_constraintStart_toStartOf="parent"
32 app:layout_constraintTop_toBottomOf="@+id/tvResultado_UD03_01_A2_Intent" />
33 </android.support.constraint.ConstraintLayout>
A clase Java da Activity que recibe a chamada. Activity Secundaria.
1 package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.CheckBox;
9 import android.widget.EditText;
10 import android.widget.Toast;
11
12 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
13
14 public class UD03_01_A1_Intents extends Activity {
15
16 public final static String NOME = "nome"; // É o nome da variable
17
18 private void xestionarEventos(){
19
20 Button btnLanzarActivity = findViewById(R.id.btnLanzar_UD03_01_A1_Intent);
21 btnLanzarActivity.setOnClickListener(new View.OnClickListener() {
22 @Override
23 public void onClick(View v) {
24 CheckBox chkDestruir = findViewById(R.id.ckDestruir_UD03_01_A1_Intents);
25 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
26
27 Intent intent = new Intent(getApplicationContext(), UD03_01_A2_Intents.class);
28 intent.putExtra(NOME, etNome.getText().toString());
29
30 startActivity(intent);
31
32 if (chkDestruir.isChecked()) {
33 finish();
34 }
35 }
36
37 });
38
39 }
40
41 public void finish() {
42 super.finish();
43 Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
44 }
45
46 @Override
47 protected void onCreate(Bundle savedInstanceState) {
48 super.onCreate(savedInstanceState);
49 setContentView(R.layout.activity_ud03_01__a1_intents);
50
51 xestionarEventos();
52 }
53 }
- Para recuperar a información na segunda Activty hai que realizalo cando se está creando a Activity, pode ser nun método a parte chamado dende o onCreate() ou no propio onCreate();
- Liña 14: Variable tipo String para gardar a forma na que se sae da segunda activity: Botón Pechar ou tecla Back.
- Liña 20: En caso de premer o botón 'Pechar' a variable anterior ten un texto indicandolo (entón xa non vale null)
- Liña 21: Chamamos ao método finish() para que peche a activity.
- Liña 29-30: En caso de que a variable formaPecharActivity==null quere dicir que estamos destruíndo a activity pero non a través do botón, se non premendo o botón Back.
- Liña 42: Recuperamos o intent enviado dende a activity principal.
- Liña 43: Collemos a información que viña en NOME e mostrámola nunha etiqueta de texto.
Continuación caso Práctico 1: Pasar datos da actividade secundaria á principal
- Até agora pasamos datos da actividade principal á secundaria.
- Imos modificar a aplicación anterior, para que na secundaria se poida introducir o apelido dunha persoa e este se pase á actividade principal.
- Ademais imos controlar na Actividade Principal se se volveu da actividade secundaria premendo o botón Pechar ou a botonera Back.
- A continuación vanse ver os cambios introducidos no código anterior.
Pasar datos da secundaria á principal: A clase Java da Activity principal
- A continuación vaise indicar o código que se engadiu ou modificou con respecto ao anterior.
- Agora á actividade secundaria chámase con método startActivityForResult(intent, número). Este método indícalle que esperamos que nos devolva un resultado cando esta remate.
- O número que lle pasamos á actividade secundaria é o que nos vai devolver esta cando se peche e así cando se volva á actividade principal, nesta, co método onActivityResult(int requestCode, int resultCode, Intent data) podemos comprobar que número nos devolve a actividade que nos pasa o control e actuar en consecuencia.
- Referencias:
1 package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.CheckBox;
9 import android.widget.EditText;
10 import android.widget.Toast;
11
12 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
13
14 public class UD03_01_A1_Intents extends Activity {
15
16 public final static String NOME = "nome"; // É o nome da variable
17 public final static String APELIDO = "apelido"; // É o nome da variable
18 private static final int COD_PETICION = 33;
19
20 private void xestionarEventos(){
21
22 Button btnLanzarActivity = findViewById(R.id.btnLanzar_UD03_01_A1_Intent);
23 btnLanzarActivity.setOnClickListener(new View.OnClickListener() {
24 @Override
25 public void onClick(View v) {
26 CheckBox chkDestruir = findViewById(R.id.ckDestruir_UD03_01_A1_Intents);
27 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
28
29 Intent intent = new Intent(getApplicationContext(), UD03_01_A2_Intents.class);
30 intent.putExtra(NOME, etNome.getText().toString());
31
32 // startActivity(intent);
33 startActivityForResult(intent, COD_PETICION);
34
35 if (chkDestruir.isChecked()) {
36 finish();
37 }
38 }
39
40 });
41
42 }
43 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
44
45 if (requestCode == COD_PETICION) {
46 if (resultCode == RESULT_OK) {
47 if (data.hasExtra(UD03_01_A1_Intents.APELIDO)) {
48 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
49 Toast.makeText(this, etNome.getText() + "\nO teu apelido é: " + data.getExtras().getString(UD03_01_A1_Intents.APELIDO), Toast.LENGTH_SHORT).show();
50 }
51
52 } else
53 Toast.makeText(this, "Saíches da actividade secundaria sen premer o botón Pechar", Toast.LENGTH_SHORT).show();
54 }
55
56 }
57
58 public void finish() {
59 super.finish();
60 Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
61 }
62
63 @Override
64 protected void onCreate(Bundle savedInstanceState) {
65 super.onCreate(savedInstanceState);
66 setContentView(R.layout.activity_ud03_01__a1_intents);
67
68 xestionarEventos();
69 }
70 }
- Liña 17: Ao igual que no caso de 'nome', teremos outra variable que gardará o apelido enviado dende a activity segunda á primeira.
- Liña 18: Creamos unha constante enteira e asinámoslle un número calquera, que se lle vai pasar á actividade secundaria cando se chame e que ela nos vai devolver cando se peche.
- Liña 33: Chamamos ao intent asociado á actividade secundaria facendo uso do método startActivityForResult, pasándolle un número que logo nos devolverá cando esta se peche e devolva o control á actividade principal. A diferenza da forma anterior, chamando a este método indicamos que a activity á que chamamos vai devolver información, a cal será recollida no método onActivityResult.
- Liña 43: o método onActivityResult (int requestCode, int resultCode, Intent data) actívase cando se volve dunha actividade secundaria.
- En requestCode: recollemos o código que nos envía esa actividade secundaria, e así controlando ese código podemos saber de que actividade secundaria se regresou á principal.
- En resultCode: recibimos o código que nos pasaron dende a actividade secundaria:
- public static final int RESULT_CANCELED= 0 (0x00000000). Para cando queremos indicar que na actividade secundaria se cancelou algo.
- public static final int RESULT_OK= -1 (0xffffffff). Para cando queremos indicar que o que se tiña que facer na activity secundaria fíxose correctamente.
- data: recibimos o intent que nos envía a clase secundaria, e que podemos ver se nos pasa algún valor do estilo CHAVE-VALOR, url, etc.
- Liña 45: Comprobamos se á volta á actividade principal é por mor da actividade secundaria: RecibirDatos que chamamos antes co número 33.
- Liña 46: Comprobamos se na activity secundaria se concluíu dun xeito exitoso. Se non é así, unha das razóns polas que non se puido rematar foi porque se premeu o botón Back (liña 54).
- Liña 47: comprobamos se o intent data ten un campo APELIDO de ser así ...
- Liña 49: ... extraemos o seu valor e amosamos a través dun Toast.
Pasar datos da secundaria á principal: O XML da activity secundaria
- Só se engadiu un EditText.
1 <?xml version="1.0" encoding="utf-8"?>
2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".Intents.UD03_01_A2_Intents">
8
9 <TextView
10 android:id="@+id/tvResultado_UD03_01_A2_Intent"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_marginEnd="8dp"
14 android:layout_marginStart="8dp"
15 android:layout_marginTop="8dp"
16 android:contentDescription="Nome enviado"
17 android:text="Resultado"
18 app:layout_constraintEnd_toEndOf="parent"
19 app:layout_constraintStart_toStartOf="parent"
20 app:layout_constraintTop_toTopOf="parent" />
21
22 <Button
23 android:id="@+id/btnPechar_UD03_01_A2_Intent"
24 android:layout_width="wrap_content"
25 android:layout_height="wrap_content"
26 android:layout_marginEnd="8dp"
27 android:layout_marginStart="8dp"
28 android:layout_marginTop="28dp"
29 android:text="Pechar"
30 app:layout_constraintEnd_toEndOf="parent"
31 app:layout_constraintStart_toStartOf="parent"
32 app:layout_constraintTop_toBottomOf="@+id/etApelido_UD03_01_A2_Intents" />
33
34 <EditText
35 android:id="@+id/etApelido_UD03_01_A2_Intents"
36 android:layout_width="wrap_content"
37 android:layout_height="wrap_content"
38 android:layout_marginEnd="8dp"
39 android:layout_marginStart="8dp"
40 android:layout_marginTop="24dp"
41 android:ems="10"
42 android:hint="Apelido"
43 android:inputType="textPersonName"
44 app:layout_constraintEnd_toEndOf="parent"
45 app:layout_constraintStart_toStartOf="parent"
46 app:layout_constraintTop_toBottomOf="@+id/tvResultado_UD03_01_A2_Intent" />
47 </android.support.constraint.ConstraintLayout>
Pasar datos da secundaria á principal: A clase Java da Activity secundaria
1 package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.widget.EditText;
8 import android.widget.TextView;
9
10 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
11
12 public class UD03_01_A2_Intents extends Activity {
13
14 // private String formaPecharActivity=null;
15
16 private void xestionarEventoss(){
17 findViewById(R.id.btnPechar_UD03_01_A2_Intent).setOnClickListener(new View.OnClickListener() {
18 @Override
19 public void onClick(View v) {
20 // formaPecharActivity = " Premendo botón Pechar";
21
22 EditText et_apelido = (EditText) findViewById(R.id.etApelido_UD03_01_A2_Intents);
23
24 Intent datos_volta = new Intent();
25 datos_volta.putExtra(UD03_01_A1_Intents.APELIDO, et_apelido.getText().toString());
26 setResult(RESULT_OK, datos_volta);
27
28 finish();
29 }
30 });
31 }
32
33 public void finish() {
34 super.finish(); // IMPORTANTE. SEMPRE HAI QUE CHAMAR A SUPER.XXXX en calquera método do ciclo de vida da activity que sobrecarguemos
35
36 /*
37 if (formaPecharActivity==null){ // Quere dicir que vimos de pulsar o botón atrás, non o botón pechar, xa que se prememos o botón Pechar damos un valor á variable
38 formaPecharActivity = " Premendo botonera Retroceso";
39 }
40 Toast.makeText(this, "Saíches da actividade secundaria: " + formaPecharActivity, Toast.LENGTH_SHORT).show();
41 */
42 }
43
44 @Override
45 protected void onCreate(Bundle savedInstanceState) {
46 super.onCreate(savedInstanceState);
47 setContentView(R.layout.activity_ud03_01__a2__intents);
48
49 // Recuperamos o nome enviado dende a Activity 1
50 TextView tvResultado = (TextView) findViewById(R.id.tvResultado_UD03_01_A2_Intent);
51 Intent intent = getIntent();
52 tvResultado.setText("Ola " + intent.getExtras().getString(UD03_01_A1_Intents.NOME));
53
54 xestionarEventoss();
55 }
56 }
- Liñas 14,20,36-41: Comentámolas pois agora na actividade principal xa somos quen de saber se o usuario premeu ou non o botón Pechar ou Back polo código de volta da activity.
- Liña 24: Creamos un novo intent.
- Liña 25: Engadimos datos extendidos ao intent, neste caso o par: APELIDO-Valor.
- Liña 26: setResult envíalle o resultado á activity chamadora có código RESULT_OK. Poderíamos enviar o código RESULT_CANCELED noutro suposto programado por nos.
Continuación caso práctico 1: Chamar a unha activity doutra aplicación: á calculadora
- A continuación imos engadir máis código ás clases e xmls anteriores para poder chamar a unha activity doutra aplicación, neste caso do sistema.
- Imos facelo de forma explícita.
Chamar á calculadora: o xml da activity principal.
- Simplemente engadimos un novo botón (Liñas 57-67).
1 <?xml version="1.0" encoding="utf-8"?>
2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 tools:context=".Intents.UD03_01_A1_Intents">
8
9 <TextView
10 android:id="@+id/tvNome_UD03_01_A1_Intent"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_marginStart="8dp"
14 android:layout_marginTop="8dp"
15 android:text="Dime o teu nome:"
16 android:textSize="18sp"
17 app:layout_constraintStart_toStartOf="parent"
18 app:layout_constraintTop_toTopOf="@+id/etNome_UD03_01_A1_Intents" />
19
20 <EditText
21 android:id="@+id/etNome_UD03_01_A1_Intents"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:layout_marginStart="8dp"
25 android:layout_marginTop="8dp"
26 android:ems="10"
27 android:inputType="textPersonName"
28 android:hint="Nome a enviar"
29 app:layout_constraintStart_toEndOf="@+id/tvNome_UD03_01_A1_Intent"
30 app:layout_constraintTop_toTopOf="parent" />
31
32 <CheckBox
33 android:id="@+id/ckDestruir_UD03_01_A1_Intents"
34 android:layout_width="wrap_content"
35 android:layout_height="wrap_content"
36 android:layout_marginEnd="8dp"
37 android:layout_marginStart="8dp"
38 android:layout_marginTop="48dp"
39 android:text="Destruír esta activity ao chamar á segunda"
40 android:textSize="14sp"
41 app:layout_constraintEnd_toEndOf="parent"
42 app:layout_constraintStart_toStartOf="parent"
43 app:layout_constraintTop_toBottomOf="@+id/etNome_UD03_01_A1_Intents" />
44
45 <Button
46 android:id="@+id/btnLanzar_UD03_01_A1_Intent"
47 android:layout_width="0dp"
48 android:layout_height="wrap_content"
49 android:layout_marginEnd="8dp"
50 android:layout_marginStart="8dp"
51 android:layout_marginTop="16dp"
52 android:text="Chamar 2ª Activity: Recibir Datos"
53 app:layout_constraintEnd_toEndOf="parent"
54 app:layout_constraintStart_toStartOf="parent"
55 app:layout_constraintTop_toBottomOf="@+id/ckDestruir_UD03_01_A1_Intents" />
56
57 <Button
58 android:id="@+id/btnCalculadora_UD03_01_A1_Intents"
59 android:layout_width="0dp"
60 android:layout_height="wrap_content"
61 android:layout_marginEnd="8dp"
62 android:layout_marginStart="8dp"
63 android:layout_marginTop="8dp"
64 android:text="Lanzar Calculadora"
65 app:layout_constraintEnd_toEndOf="parent"
66 app:layout_constraintStart_toStartOf="parent"
67 app:layout_constraintTop_toBottomOf="@+id/btnLanzar_UD03_01_A1_Intent" />
68 </android.support.constraint.ConstraintLayout>
Chamar á calculadora: A clase java da activity principal.
- Engadimos o código para procesar o evento onClick do botón.
1 package es.cursoandroid.cifprodolfoucha.aprendiendo.Intents;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.widget.Button;
8 import android.widget.CheckBox;
9 import android.widget.EditText;
10 import android.widget.Toast;
11
12 import es.cursoandroid.cifprodolfoucha.aprendiendo.R;
13
14 public class UD03_01_A1_Intents extends Activity {
15
16 public final static String NOME = "nome"; // É o nome da variable
17 public final static String APELIDO = "apelido"; // É o nome da variable
18 private static final int COD_PETICION = 33;
19
20 private void xestionarEventos(){
21
22 // Botón para lanzar a segunda activity
23 Button btnLanzarActivity = findViewById(R.id.btnLanzar_UD03_01_A1_Intent);
24 btnLanzarActivity.setOnClickListener(new View.OnClickListener() {
25 @Override
26 public void onClick(View v) {
27 CheckBox chkDestruir = findViewById(R.id.ckDestruir_UD03_01_A1_Intents);
28 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
29
30 Intent intent = new Intent();
31 // intent.setClassName("es.cursoandroid.cifprodolfoucha.aprendiendo","es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents");
32 intent.setClassName(getApplicationContext(),"es.cursoandroid.cifprodolfoucha.aprendiendo.Intents.UD03_01_A2_Intents");
33 intent.putExtra(NOME, etNome.getText().toString());
34
35 // startActivity(intent);
36 startActivityForResult(intent, COD_PETICION);
37
38 if (chkDestruir.isChecked()) {
39 finish();
40 }
41 }
42 });
43
44 //Botón para lanzar a calculadora do S.O.
45 Button btnCalculadora = findViewById(R.id.btnCalculadora_UD03_01_A1_Intents);
46 btnCalculadora.setOnClickListener(new View.OnClickListener() {
47 @Override
48 public void onClick(View v) {
49 Intent intent = new Intent();
50 intent.setClassName("com.android.calculator2", "com.android.calculator2.Calculator");
51 startActivity(intent);
52 }
53 });
54
55 }
56 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
57
58 if (requestCode == COD_PETICION) {
59 if (resultCode == RESULT_OK) {
60 if (data.hasExtra(UD03_01_A1_Intents.APELIDO)) {
61 EditText etNome = findViewById(R.id.etNome_UD03_01_A1_Intents);
62 Toast.makeText(this, etNome.getText() + "\nO teu apelido é: " + data.getExtras().getString(UD03_01_A1_Intents.APELIDO), Toast.LENGTH_SHORT).show();
63 }
64
65 } else
66 Toast.makeText(this, "Saíches da actividade secundaria sen premer o botón Pechar", Toast.LENGTH_SHORT).show();
67 }
68
69 }
70
71 public void finish() {
72 super.finish();
73 Toast.makeText(this, "Mataches a actividade principal", Toast.LENGTH_SHORT).show();
74 }
75
76 @Override
77 protected void onCreate(Bundle savedInstanceState) {
78 super.onCreate(savedInstanceState);
79 setContentView(R.layout.activity_ud03_01__a1_intents);
80
81 xestionarEventos();
82 }
83 }
- Liña 50: Nesta ocasión co método setClassName(String packageName, String className) indicámoslle no nome do paquete que contén a clase e nome da clase.
Paso de datos complexos dunha activity a outra
- Nos exemplos anteriores estamos a pasar datos de tipo String dunha activity a outra.
- Pero tamén podemos facer uso da clase Bundle, como xa vimos no ciclo de vida das Activities.
- Para iso temos que chamar ao método putExtras da clase Intent desta forma:
1 Intent intent = new Intent(this,Activity_Chamar.class);
2
3 Bundle datos = new Bundle();
4 datos.putString("VARIABLE1",VALOR1);
5 datos.putInt("VARIABLE2",VALOR2);
6 .............
7 intent.putExtras(datos);
8
9 startActivity(intent);
- Para recuperar os datos na activity 'destino' facemos o proceso contrario:
1 @Override
2 protected void onCreate(Bundle savedInstanceState) {
3 super.onCreate(savedInstanceState);
4 setContentView(R.layout.activity_ud03_01__a2__intents);
5
6 Intent intent = getIntent();
7 Bundle datos = intent.getExtras();
8 String valor1 = datos.getString("VARIABLE1");
9
10 }
- NOTA IMPORTANTE: Lembrar que se gardades o contido dun View (por exemplo, o EditText) o contido a gardar será: editText.getText().toString()
- Tedes que facer uso do método 'toString()'.
- Se queremos pasar obxectos pertencentes a clases complexas dunha activity a outra, teremos que facer uso da interface Parceleable a cal deberemos implementar na clase que queremos utilizar para pasar os datos.
- Tedes un exemplo completo de uso neste enlace.
-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).