Lanzando otra Activity de mi App

Para lanzar una Activity tenemos que utilizar un Intent, que puede ser explícito o implícito. En esta entrada vamos a ver cómo gestionar el lanzamiento de una Activity de nuestra aplicación la cual conocemos, por lo que usaremos un explicit intent.

Creamos una nueva activity, para ello nos colocamos en el package donde queremos crear la Activity. Abrimos el menú contextual con el botón derecho del ratón y seleccionamos New->Activity-> por ejemplo Blank Activity.  Le damos nombre y una vez creada veremos el fichero Java y el fichero Xml del Layout nuevo.

Supongamos que hemos creado una Activity llamada Saludo, tendremos el xml del layout como activity_saludo (si no le hemos cambiado el nombre al layout).

Supongamos que tenemos un botón Saludo en la MainActivity y que cuando pulsemos queremos lanzar la Activity Saludo. Además, tenemos un EditText donde el usuario escribirá su nombre, que deberá ser enviado a la activity saludo por medio del Intent.

La pantalla de la Main Activity podría se algo así:

El código a colocar como respuesta al click en el botón saludo sería algo así:

        EditText etText = (EditText) findViewById(R.id.edtSaludo);
        String strSaludo = etText.getText().toString();
        if (!(strSaludo.isEmpty())) {
            //Cosas que se hacen al pulsar el boton
            Intent intent = new Intent(MainActivity.this, Saludo.class);
            intent.putExtra("txtSaludo", strSaludo);
            startActivity(intent);
        } else {
            Toast.makeText(getApplicationContext(), "Rellena el campo de texto", Toast.LENGTH_SHORT).show();
        }

Tendremos que detectar si  el usuario ha rellenado su nombre, si no lo ha hecho, mostraremos un Toast indicándole que lo haga. Para hacer esto, obtenemos el objeto EditText asociado usando findViewById y usando el recurso por Id.

Capturamos éste valor con getText().ToString() del objeto EditText. Si hay valor, es decir, no isEmpty, entonces lanzamos la activity, sino, lanzamos un Toast alertando al usuario.

Para lanzar la Activity Saludo, creamos un explicit intent. Un explicit intent debe llevar completamente cualificado el destino, el segundo parámetro del constructor del Intent. En este segundo parámetro debemos poner el nombre de la clase que implementa el Activty que queremos llamar. En este caso, al estar en el mismo packcage, con poner el nombre del Activity seguido de .class es suficiente.  El primer campo como vemos es un contexto, el contexto de la MainActivity. Para saber más sobre Contextos.

Una vez tenemos el Intent creado, añadimos mediante PutExtra el valor del nombre como un campo Extra del intent.  Como vemos en la imagen,  el método putExtra tiene múltiples constructores, en este caso queremos enviar un string, por lo que elegiremos el constructor con dos parámetros String,  es decir putExtra(String name, String value) . Esto es una pareja clave,valor. El primer string es la clave, el nombre que identifica al valor, que es el segundo parámetro.

Finalmente llamamos a StartActivity para lanzar la actividad especificada en el Intent.

En la Activity Saludo, supongamos que tenemos un TextView donde queremos colocar el mensaje:  “Hola Fulanito, bienvenido”

Para capturar el valor que viene en el intent, la pareja clave,valor podemos usar este código:

        tvNombre= (TextView)findViewById(R.id.out);
        Bundle extras = getIntent().getExtras();
        if (extras != null){
            String saludostring=extras.getString("txtSaludo");
            tvNombre.setText("Hola " + saludostring + ", bienvenido.");
        }

Como vemos obtenemos primero los extras que vienen con el intent.  Para acceder al intent usamos getIntent() y para acceder a los extras dentro del intent usamos getExtras().

Es posible que hayamos llegado a esta Activity sin que se envíen extras, por lo que tenemos que comprobar que el Bundle (un conjunto de información o datos que pueden serializarse) no es null.

Mediante el método getString(clave) del bundle, obtenemos el valor de dicha clave desde el bundle. Una vez obtenido lo asignamos al TextView mediante setText().