Diferencia entre revisiones de «Usuario:ManuelRomero/Intents»
De WikiEducator
(→Intents para lanzar activity) |
(→Los ficheros java) |
||
(11 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 5: | Línea 5: | ||
http://developer.android.com/reference/android/content/Intent.html | http://developer.android.com/reference/android/content/Intent.html | ||
*Definición de la página oficial | *Definición de la página oficial | ||
− | + | {{Definicion|'''''Un intent es una descripción abstracta de una operación que va a llevar a cabo}} | |
*Es una clase da android que permite instanciar nuevos objetos Activity. | *Es una clase da android que permite instanciar nuevos objetos Activity. | ||
Línea 27: | Línea 27: | ||
[[Imagen:intent1.png|400px]] | [[Imagen:intent1.png|400px]] | ||
===Empezamos=== | ===Empezamos=== | ||
− | *Creamos un proyecto nuevo llamado p.e. ''''' | + | *Creamos un proyecto nuevo llamado p.e. '''''usandoIntents''''' |
− | *Clase ActividadPrimera.java | + | *Clase '''''ActividadPrimera.java''''' |
− | *Layout actividad_primera.xml | + | *Layout ''''''actividad_primera.xml''''' |
− | *Por supuesto los nombres son | + | **Por supuesto los nombres son ''opciones'' |
+ | *Creamos una clase nueva llamada '''''ActividadSegunada.java''''' | ||
+ | [[Imagen:claseNueva.png]] | ||
*Al tener dos activity debemos indicarlo en el fichero '''''Manifiest.xml''''' | *Al tener dos activity debemos indicarlo en el fichero '''''Manifiest.xml''''' | ||
*Añadimos la nueva clase activity | *Añadimos la nueva clase activity | ||
− | *Vemos a | + | *Vemos a continuación la parte del manifest con las clases |
<source lang=xml> | <source lang=xml> | ||
<activity | <activity | ||
Línea 52: | Línea 54: | ||
</activity> | </activity> | ||
</source> | </source> | ||
− | * | + | *Nos debemos fijar en el elemento '''''intent-filter''''' |
− | *En este caso el elementos '''''action''''' tiene el nombre de la clase, a diferencia del activity principal que contenía el valor MAIN | + | *En este caso el elementos '''''action''''' tiene ''el nombre del filtro especificado al nombre de la clase', a diferencia del ''activity principal' que contenía el valor '''''MAIN''''' |
− | *El elemento category | + | **De este modo otras actividades que quieran llamar a ésta lo harán por este nombre |
+ | *El elemento '''''category''''' para el filtro contiene el valor '''''DEFAULT''''' el lugar del valor '''''LAUNCHER''''' | ||
+ | *Esto indica que esta actividad será lanzada por defecto siendo invocada por otra mediante el método ''''''startActivity()'''''' no desde el lanzador de aplicaciones del dispositivos | ||
− | |||
− | |||
===Los layouts=== | ===Los layouts=== | ||
− | *Creamos los dos layouts para cada activity | + | *Creamos los dos layouts para cada activity |
− | *Cada uno contendrá una etiqueta de texto o label y un botón | + | *Cada uno contendrá una etiqueta de texto o label y un botón (por las especificaciones primeras |
+ | *Los layouts les hemos llamado en este caso '''''actividad_primera.xml''''' y '''''actividad_segunda.xml''''' | ||
+ | ;actividad_primera.xml | ||
<source lang=java> | <source lang=java> | ||
+ | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
+ | xmlns:tools="http://schemas.android.com/tools" | ||
+ | android:layout_width="match_parent" | ||
+ | android:layout_height="match_parent" > | ||
+ | |||
+ | <TextView | ||
+ | android:id="@+id/textView1" | ||
+ | android:layout_width="match_parent" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:text="@string/actividad1" | ||
+ | tools:context=".ActividadPrimera" /> | ||
+ | |||
+ | <Button | ||
+ | android:id="@+id/button1" | ||
+ | android:layout_width="wrap_content" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:layout_alignParentLeft="true" | ||
+ | android:layout_below="@+id/textView1" | ||
+ | android:layout_marginLeft="40dp" | ||
+ | android:layout_marginTop="41dp" | ||
+ | android:onClick="activity1" | ||
+ | android:text="Activar activity 2" /> | ||
+ | |||
+ | </RelativeLayout> | ||
+ | </source> | ||
+ | ;actividad_segunda.xml | ||
+ | <source lang=java> | ||
+ | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||
+ | xmlns:tools="http://schemas.android.com/tools" | ||
+ | android:layout_width="match_parent" | ||
+ | android:layout_height="match_parent" > | ||
+ | <TextView | ||
+ | android:id="@+id/textView1" | ||
+ | android:layout_width="wrap_content" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:text="@string/actividad2" | ||
+ | tools:context=".ActividadSegunda" /> | ||
+ | <Button | ||
+ | android:id="@+id/button1" | ||
+ | android:layout_width="wrap_content" | ||
+ | android:layout_height="wrap_content" | ||
+ | android:layout_below="@+id/textView1" | ||
+ | android:layout_centerHorizontal="true" | ||
+ | android:layout_marginTop="58dp" | ||
+ | android:onClick="activity2" | ||
+ | android:text="Cerrar actividad 2 y volver a 1" /> | ||
+ | </RelativeLayout> | ||
+ | </source> | ||
+ | *En el fichero '''''string.xml''''' tenemos las etiquetas usadas | ||
+ | <source lang=xml> | ||
+ | <string name="title_activity_actividad_primera">ActividadPrimera</string> | ||
+ | <string name="title_activity_actividad_segunda">ActividadSegunda</string> | ||
+ | <string name="actividad1">Esta es la actividad primera y principal</string> | ||
+ | <string name="actividad2">Esta es la actividad segunda</string> | ||
+ | </source> | ||
+ | ===El fichero java=== | ||
+ | *Ahora sólo queda lo que hacemos en el método del click | ||
+ | *En la actividad primera tenemos el método '''''activity1''''' (ver el fichero del layout de esta actividad) | ||
+ | <source lang=java> | ||
+ | public void activity1(View v){ | ||
+ | startActivity (new Intent("com.example.objetosintents.ActividadSegunda")); | ||
+ | } | ||
+ | </java> | ||
+ | *La forma de iniciar una actividad es con el método '''''startActivity()'''' | ||
+ | *como parámetro le pasamos una instancia de un objeto Intents con el nombre de la clase de la actividad como parámetro | ||
+ | *Se puede plantear más seccionado pero es lo mismo | ||
+ | <source lang=java> | ||
+ | public void activity1(View v){ | ||
+ | Intent claseAEjecutar = new Intent(); | ||
+ | claseAEjecutar.setAction("com.example.objetosintents.ActividadSegunda"); | ||
+ | startActivity (claseAEjecutar); | ||
+ | } | ||
+ | </source> | ||
+ | *Igualmente podemos especificar el nombre del la clase .class | ||
+ | <source lang=java> | ||
+ | public void activity1(View v){ | ||
+ | Intent claseAEjecutar = new Intent(); | ||
+ | claseAEjecutar.setClass(this, ActividadSegunda.class); | ||
+ | startActivity (claseAEjecutar); | ||
+ | } | ||
+ | </source> | ||
+ | *Y lo mismo de manera más compacta | ||
+ | <source lang=java> | ||
+ | public void activity1(View v){ | ||
+ | startActivity (new Intent(this,ActividadSegunda.class)); | ||
+ | } | ||
+ | </source> | ||
+ | =Intents con parámetros= | ||
+ | *Es muy posible que queramos pasar/recuperar datos entre actividades | ||
+ | *Por ejemplo que una activity me pase usuario y contraseña para validar | ||
+ | ===Devolviendo resultados=== | ||
+ | *Ahora queremos hacer un diseño como el siguiente | ||
+ | [[Imagen:intent2.png|400px]] | ||
+ | #Realizamos los diseños | ||
+ | fichero manifest con dos activity | ||
+ | Dos ficheros java | ||
+ | dos ficheros de layout | ||
+ | ===Los ficheros java=== | ||
+ | <source lang=java> | ||
+ | public void validarUsuario(View v){ | ||
+ | Intent datosUsuario = new Intent(); | ||
+ | EditText tNombre= (EditText) findViewById(R.id.Nombre); | ||
+ | EditText tApellido= (EditText) findViewById(R.id.Apellido); | ||
+ | |||
+ | //Obtenemos el valor de la caja de texto | ||
+ | |||
+ | //Utilizamos putExtra() para obtener los pares nombre/valor | ||
+ | datosUsuario.putExtra("nombre", tNombre.getText().toString()); | ||
+ | datosUsuario.putExtra("apellido", tApellido.getText().toString()); | ||
+ | |||
+ | //Utilizamos el método setData() para devover algunos valores | ||
+ | datosUsuario.setData(Uri.parse("Enviando valores")); | ||
+ | |||
+ | //Establecemos el resultado con OK | ||
+ | setResult(RESULT_OK,datosUsuario); | ||
+ | |||
+ | //Destruimos el objeto | ||
+ | finish(); | ||
+ | |||
+ | |||
+ | //iniciamos actividad | ||
+ | datosUsuario.setClass(this, ValidacionDatos.class); | ||
+ | startActivityForResult(datosUsuario,1); | ||
+ | } | ||
+ | |||
+ | public void onActivityResult (int codigoRespuesta, int codigoResultado, Intent datos){ | ||
+ | if (codigoRespuesta==1){ | ||
+ | if (codigoResultado == RESULT_OK){ | ||
+ | Toast.makeText(this, "no no se se", Toast.LENGTH_LONG); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </source> | ||
+ | <source lang=java> | ||
+ | public class ValidacionDatos extends Activity { | ||
+ | public void onCreate(Bundle estadoActividad){ | ||
+ | super.onCreate(estadoActividad); | ||
+ | setContentView(R.layout.activity_validacion_datos); | ||
+ | |||
+ | |||
+ | //Obtener los datos pasados usand getStringExtra() | ||
+ | Toast.makeText(this,getIntent().getStringExtra("nombre"),Toast.LENGTH_LONG).show(); | ||
+ | |||
+ | //Obtener los datos pasados usand getStringExtra() | ||
+ | Toast.makeText(this,getIntent().getStringExtra("apellido"),Toast.LENGTH_LONG).show(); | ||
+ | |||
+ | |||
+ | //Obetener el objeto Bundle pasado | ||
+ | //Bundle nose=getIntent().getExtras(); | ||
+ | |||
+ | //Obtener los datos pasados usand getStringExtra() | ||
+ | //Toast.makeText(this,nose.getString("nombre"),Toast.LENGTH_LONG).show(); | ||
+ | |||
+ | //Obtener los datos pasados usand getStringExtra() | ||
+ | //Toast.makeText(this,nose.getString("apellido"),Toast.LENGTH_LONG).show(); | ||
+ | } | ||
+ | |||
+ | public void clickValidacion(View v) { | ||
+ | Toast.makeText(this,"Valicación terminada",Toast.LENGTH_LONG).show(); | ||
+ | finish(); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
</source> | </source> |
Última revisión de 21:46 15 nov 2012
Intents
- Referencia
http://developer.android.com/reference/android/content/Intent.html
- Definición de la página oficial
- Es una clase da android que permite instanciar nuevos objetos Activity.
- Es decir nos permite especificar una Activity para que se ejecute
- En Android una aplicacióno o componente no sólo es una Activity
- En Android tenemos los siguientes componentes
- Activity como componenetes de UI
- Services
- Código ejecutándose en segundo plan o
- Broadcast receivers
- Broadcst messages código que responde a un mensaje de transmisión
- Proveedores de contenidos código que abstrae los datos
Intents para lanzar activity
- Uso extremasamente sencillo
- Realicemos un ejemplo sencillo
- Idea: hacer un programa como se ve en la figura
- Cada pantalla será un activity.
- El click del activity 1 abrirá el activity 2
- El click del activity 2 cerrará el activity 2 y volverá al activity 1
Empezamos
- Creamos un proyecto nuevo llamado p.e. usandoIntents
- Clase ActividadPrimera.java
- Layout 'actividad_primera.xml
- Por supuesto los nombres son opciones
- Creamos una clase nueva llamada ActividadSegunada.java
- Al tener dos activity debemos indicarlo en el fichero Manifiest.xml
- Añadimos la nueva clase activity
- Vemos a continuación la parte del manifest con las clases
<activity android:name=".ActividadPrimera" android:label="@string/title_activity_actividad_primera" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ActividadSegunda" android:label="@string/title_activity_actividad_segunda" > <intent-filter> <action android:name="com.example.objetosintents.ActividadSegunda" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
- Nos debemos fijar en el elemento intent-filter
- En este caso el elementos action tiene el nombre del filtro especificado al nombre de la clase', a diferencia del activity principal' que contenía el valor MAIN
- De este modo otras actividades que quieran llamar a ésta lo harán por este nombre
- El elemento category para el filtro contiene el valor DEFAULT el lugar del valor LAUNCHER
- Esto indica que esta actividad será lanzada por defecto siendo invocada por otra mediante el método 'startActivity()' no desde el lanzador de aplicaciones del dispositivos
Los layouts
- Creamos los dos layouts para cada activity
- Cada uno contendrá una etiqueta de texto o label y un botón (por las especificaciones primeras
- Los layouts les hemos llamado en este caso actividad_primera.xml y actividad_segunda.xml
- actividad_primera.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/actividad1" tools:context=".ActividadPrimera" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/textView1" android:layout_marginLeft="40dp" android:layout_marginTop="41dp" android:onClick="activity1" android:text="Activar activity 2" /> </RelativeLayout>
- actividad_segunda.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/actividad2" tools:context=".ActividadSegunda" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="58dp" android:onClick="activity2" android:text="Cerrar actividad 2 y volver a 1" /> </RelativeLayout>
- En el fichero string.xml tenemos las etiquetas usadas
<string name="title_activity_actividad_primera">ActividadPrimera</string> <string name="title_activity_actividad_segunda">ActividadSegunda</string> <string name="actividad1">Esta es la actividad primera y principal</string> <string name="actividad2">Esta es la actividad segunda</string>
El fichero java
- Ahora sólo queda lo que hacemos en el método del click
- En la actividad primera tenemos el método activity1 (ver el fichero del layout de esta actividad)
public void activity1(View v){ startActivity (new Intent("com.example.objetosintents.ActividadSegunda")); } </java> *La forma de iniciar una actividad es con el método '''''startActivity()'''' *como parámetro le pasamos una instancia de un objeto Intents con el nombre de la clase de la actividad como parámetro *Se puede plantear más seccionado pero es lo mismo <source lang=java> public void activity1(View v){ Intent claseAEjecutar = new Intent(); claseAEjecutar.setAction("com.example.objetosintents.ActividadSegunda"); startActivity (claseAEjecutar); }
- Igualmente podemos especificar el nombre del la clase .class
public void activity1(View v){ Intent claseAEjecutar = new Intent(); claseAEjecutar.setClass(this, ActividadSegunda.class); startActivity (claseAEjecutar); }
- Y lo mismo de manera más compacta
public void activity1(View v){ startActivity (new Intent(this,ActividadSegunda.class)); }
Intents con parámetros
- Es muy posible que queramos pasar/recuperar datos entre actividades
- Por ejemplo que una activity me pase usuario y contraseña para validar
Devolviendo resultados
- Ahora queremos hacer un diseño como el siguiente
- Realizamos los diseños
fichero manifest con dos activity Dos ficheros java dos ficheros de layout
Los ficheros java
public void validarUsuario(View v){ Intent datosUsuario = new Intent(); EditText tNombre= (EditText) findViewById(R.id.Nombre); EditText tApellido= (EditText) findViewById(R.id.Apellido); //Obtenemos el valor de la caja de texto //Utilizamos putExtra() para obtener los pares nombre/valor datosUsuario.putExtra("nombre", tNombre.getText().toString()); datosUsuario.putExtra("apellido", tApellido.getText().toString()); //Utilizamos el método setData() para devover algunos valores datosUsuario.setData(Uri.parse("Enviando valores")); //Establecemos el resultado con OK setResult(RESULT_OK,datosUsuario); //Destruimos el objeto finish(); //iniciamos actividad datosUsuario.setClass(this, ValidacionDatos.class); startActivityForResult(datosUsuario,1); } public void onActivityResult (int codigoRespuesta, int codigoResultado, Intent datos){ if (codigoRespuesta==1){ if (codigoResultado == RESULT_OK){ Toast.makeText(this, "no no se se", Toast.LENGTH_LONG); } } }
public class ValidacionDatos extends Activity { public void onCreate(Bundle estadoActividad){ super.onCreate(estadoActividad); setContentView(R.layout.activity_validacion_datos); //Obtener los datos pasados usand getStringExtra() Toast.makeText(this,getIntent().getStringExtra("nombre"),Toast.LENGTH_LONG).show(); //Obtener los datos pasados usand getStringExtra() Toast.makeText(this,getIntent().getStringExtra("apellido"),Toast.LENGTH_LONG).show(); //Obetener el objeto Bundle pasado //Bundle nose=getIntent().getExtras(); //Obtener los datos pasados usand getStringExtra() //Toast.makeText(this,nose.getString("nombre"),Toast.LENGTH_LONG).show(); //Obtener los datos pasados usand getStringExtra() //Toast.makeText(this,nose.getString("apellido"),Toast.LENGTH_LONG).show(); } public void clickValidacion(View v) { Toast.makeText(this,"Valicación terminada",Toast.LENGTH_LONG).show(); finish(); } }