A. Descripción
El ejercicio se realizará sobre el código del ejercicio 2 resuelto. Ahora se le añadirán dos nuevos botones en la segunda actividad, uno que cierre esa segunda actividad y otro que cierre esa actividad, y la anterior (mediante algún “mensaje” a la primera).
B. Implementación
El código de los objetos Button como vimos en anteriores ejercicios, se declara de la siguiente manera:
Button boton = (Button) findViewById (R.id.Button);
boton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
// código de la función
}
});
Para cerrar una actividad se utiliza el método finish().
Una subactividad es una actividad que devuelve un resultado. Cuando termina una subactividad se llama al manejador onActivityResult de la actividad padre desde la que
fue arrancada. Además, cualquier actividad registrada en el manifiest puede ser invocada
como subactividad. Se arranca una subactividad con startActivityForResult, pasando como parámetro el intent y un código de petición que se utilizará a la vuelta para identificar
qué subactividad es la que ha terminado. Un ejemplo:
private static final int SHOW_SUBACTIVITY = 1;
Intent intent = new Intent(this, MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);
Para que una actividad devuelva un resultado, en la subactividad se llama al método setResult() antes de la llamada a finish(). El método setResult() acepta dos parámetros: un código de resultado: Activity.RESULT_OK, Activity.RESULT_CANCELED o cualquier entero; y un Intent con datos devueltos: URI
a los contenidos devueltos (un contacto, número de teléfono, fichero media,...) y una colección de Extras con información adicional.
Intent result = new Intent();
result.putExtra(SUMA, suma); setResult(RESULT_OK, result); finish();
Para la recuperación de los resultados en la actividad padre se redefine el manejador
onActivityResult, que recibe los siguientes parámetros:
Código de petición: el código que se utilizó para arrancar la subactividad.
Código de resultado: el código que devuelve la subactividad. Si se aborta anormalmente la subactividad devuelve Activity.RESULT_CANCELED
Datos: Intent con los resultados devueltos por la subactividad.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SUMA_REQUEST) {
if (resultCode == RESULT_OK) {
int suma = data.getIntExtra(SUMA, 0);
}
}
}
C. Pasos a seguir
1. Cargar el código del proyecto Ejercicio Intermedio B – Multiples actividades con finalizacion -> Inicio en Eclipse.
2. Modificar el fichero res/layout/actividad2.xml para que sea idéntico al explicado más arriba, insertando dos objetos Button. NOTA:En los Button modificaremos el valor de la propiedad
Layout width estableciéndola a “match_parent” (indica que utilizará todo el ancho de la pantalla).
3. Crear el listener de la función onClick, para el primero objeto Button (“Cierra ésta actividad”) de la segunda actividad (Utilizar la función “findViewById ()” para obtener el Button al que nos queremos referir), el que finaliza dicha actividad. NOTA: Método finish().
4. Crear el listener de la función onClick, para el segundo objeto Button (“Cierra ésta y la anterior actividad”) de la segunda actividad (Utilizar la función “findViewById
()” para obtener el Button al que nos queremos referir), añadiéndole un boolean
que deberá devolver a la actividad “padre”, tal que “true” indique que deba finalizar
dicha actividad padre.
5. Sobreescribir el método onActivityResult de la actividad principal para que si el request_code es el de la actividad2, y el result_code es RESULT_OK, obtenga el valor boolean que devolvió la actividad2 y si éste valor es “true”, finalice
la actividad
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SUB_ACTIVIDAD) {
if (resultCode == RESULT_OK) {
}
}
}6. Cambiar la llamada startActivity(), por startActivityForResult()
para que la actividad principal “espere” un resultado.
Ejercicio Intermedio A: Múltiples Actividades
El ejercicio consistirá en la creación de dos actividades. La primera actividad contendrá un campo de texto y un botón. Al pulsar sobre este botón, el control pasa a la segunda actividad mostrando el texto que se insertó en el cuadro de texto de la primera actividad.
A. Descripción
Se trata de familiarizar al alumno con los cambios de actividades, añadir funciones a los objetos y el paso de datos entre actividades mediante Bundle, entre otros.
Para añadir una función a un objeto Button, debemos establecer un “listener” en la función onClick() de Button, y se realiza mediante la función setOnClickListener(), pasándole un objeto que implemente OnClickListener, y que tenga el método onClick. Un ejemplo:
Button boton = (Button) findViewById (R.id.Button);
boton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
// código de la función
});
Cuando queremos realizar una llamada a una actividad, utilizamos los Intents. “Un
intent es la descripción abstracta de una operación que se va a llevar a cabo”, o dicho de otro modo, un Intent es una clase que permite especificar una Activity a ejecutar, llamando a uno de los métodos de la clase Activity con ese Intent de parámetro. Así si queremos realizar la llamada a otra actividad haremos algo como lo siguiente:
Intent i = new Intent (contexto, NuevaActividad.class);
startActivity(i);
NOTA: La variable contexto, se refiere al contexto en el que está siendo utilizado.
La clase Bundle contiene tipos primitivos y objetos de otras clases, y se utiliza para pasar datos entre diferentes actividades. Para que una actividad pase datos, utilizamos la función putExtra(…). Un ejemplo:
Intent myIntent = new Intent (contexto, NuevaActividad.class);
myIntent.putExtra("com.feu.ull.cursoandroid.Value", "Hola, Juan!");
// Par clave/valor startActivity(myIntent);
Y en la otra actividad, recibimos el valor así:
Bundle bundle = getIntent().getExtras();
if (bundle != null){
data = bundle.getString("com.feu.ull.cursoandroid.Value");
}// data contendrá ahora el valor “Hola, Juan!”
B. Implementación
El código que se ofrece al usuario tiene 2 actividades creadas (Actividad1 y Actividad2). Ambas actividades estarán vacías, con sólo el código que viene a continuación:
public class Actividad1 extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.actividad1);
}
}public class Actividad2 extends Activity {
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.actividad2);
}
}Se pretende la creación de 2 actividades diferentes, cuya “vista” será la siguiente:
La primera actividad permite la inserción de un texto en el EditText, y al pulsar sobre el botón “Otra Actividad” y aparezca la segunda actividad con un TextView conteniendo el texto insertado en el EditText de la primera actividad.
C. Pasos a seguir
1. Cargar el código del proyecto Ejercicio Intermedio A – Multiples actividades -> Inicial
en Eclipse.
2. Modificar el fichero res/layout/actividad1.xml para que sea idéntico al explicado más arriba, insertando un EditText y un Button. NOTA: Debemos modificar algunas propiedades de los mismos. En el Button cambiar la propiedad Text y asignarle el texto “Otra actividad”, mientras que en el
EditText le asignaremos esta variable a vacío. En ambos también modificaremos el valor de la propiedad Layout
width estableciéndola a “match_parent” (antiguo “fill_parent”) (indica que utilizará todo el ancho de la pantalla).
3. Modificar el fichero res/layout/actividad2.xml para que sea idéntico al explicado más arriba, insertando un TextView.
NOTA: Deberemos modificar la propiedad Text y asignarle a la misma “No me llegan datos”.
4. Crear listener de la función onClick, para el objeto Button de la primera actividad.
Utilizar la función “findViewById()“ para obtener el Button al que nos queremos referir.
5. Obtener dentro del listener anterior el texto que se encuentra en el EditText.
NOTA: Mirar las funciones getText() y toString().
6. Pasar el String obtenido del paso anterior a la siguiente actividad, y realizar la
llamada a la misma. NOTA: Debemos incluir en el A ndr oid.mani fest que existe la actividad Actividad2.
Intent i = new Intent (getApplicationContext(), Actividad2.class);
i.putExtra("clave", texto);
startActivity(i);
7. Obtener en la segunda actividad el texto pasado desde la primera.
NOTA: bundle.getString (clave)
8. Establecer el texto de TextView al obtenido anteriormente. NOTA: setText()