Diferencia entre revisiones de «Usuario:ManuelRomero/Intents»

De WikiEducator
Saltar a: navegación, buscar
(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]]
+
{{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. '''''usandoItents'''''
+
*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 orientativos
+
**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 continación la parte del manifest con las clases
+
*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>
*Vemos  el elementos intent-filter
+
*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 conteien el valor DEFAULT el lugar del valor LAUNCHER
+
**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
  
*Creamos una clase nueva llamada ActividadSegunada.java
 
[[Imagen:claseNueva.png]]
 
 
===Los layouts===
 
===Los layouts===
*Creamos los dos layouts para cada activity activity con sus correspondientes layouts
+
*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 20:46 15 nov 2012



Intents

Referencia
http://developer.android.com/reference/android/content/Intent.html
  • Definición de la página oficial


Icon define.gif

Definición

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 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
  1. Activity como componenetes de UI
  2. Services
  3. Código ejecutándose en segundo plan o
  4. Broadcast receivers
  5. Broadcst messages código que responde a un mensaje de transmisión
  6. 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

Intent1.png

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

ClaseNueva.png

  • 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

Intent2.png

  1. 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();
 
	}
}