¿Como iniciar una actividad desde otra actividad?
Main.java la cual se crea automáticamente cuando crees tu nuevo proyecto, donde ubicarás un botón. La segunda actividad la crearemos nosotros. La idea es iniciarla presionando el botón a través de un Intent .Crear una nueva actividad
Main.java.<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="TUPAQUETE.petmotion" >
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Main"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Visor"
android:label="@string/title_activity_visor"
android:parentActivityName=".Main" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="TUPAQUETE.petmotion.Main" />
</activity>
</application>
</manifest>
Como ves, la actividad Visor tiene un nuevo atributo llamado android:parentActivityName , el cual contiene el nombre de la actividad padre. Que para nosotros será ".Main". Esta relación se concluye añadiendo un elemento <meta-data> a la actividad y especificar el nombre de la acción PARENT_ACTIVITY y el paquete donde se encuentra la clase "com.herprogramacion.petmotion.Main".
Diseñando las actividades
show_pet_button y el texto "Mostrar mascota".activity_main.xml obtendría el siguiente aspecto:<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".Main">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/show_pet_button"
android:id="@+id/show_pet_button"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
No hay nada de extraño en el código, ya antes hemos agregado un Button.
A continuación pasamos a agregar un ImageView en Visor. Mmm mejor no, primero te explico que propósito tiene este View y luego si vemos paso a paso como añadirlo...
¿Qué es un ImageView?
ImageView es un componente que permite visualizar las imágenes que tenemos dentro de nuestros recursos, como iconos, fotografías y demás. Permite controlar el tamaño de la imagen, la escala, filtros, transparencia, etc.show_pet_button de Main y sea dirigido a Visor para visualizar la imagen.ImageView primero nos dirigiremos a la paleta y lo arrastraremos al centro del RelativeLayout:res) del proyecto.pet1.jpg en la carpeta de recursos:src en el panel de propiedades. src representa la dirección del recurso(source) o imagen que usaremos para visualizar en el ImageView. Por lo que presionaremos el botón "...".<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="TUPAQUETE.petmotion.Visor">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:src="@drawable/pet1" />
</RelativeLayout>
Iniciar una actividad
Visor una vez sea presionado el botón show_pet_button. Para ello simplemente usaremos el método startActivity() de la clase Activity. Este método recibe como parámetro de entrada un Intent. Este intent será el encargado de portar el mensaje para ejecutar la acción, que en este caso es iniciar una actividad.import android.content.Intent; //No olvides importar la dependencia
...
//Crear un nuevo intent
Intent intent = new Intent(this,Visor.class);
//Iniciar actividad
startActivity(intent);
El constructor de intent recibe dos parámetros. El primero es el contexto desde deseamos enviar el mensaje, en este caso es nuestra propia actividad. El segundo hace referencia a la clase del componente receptor del mensaje de inicio, será nuestra clase Visor.
El código final de la actividad Main sería el siguiente:
package TUPAQUETE.petmotion;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Main extends Activity implements OnClickListener {
private Button show_pet_button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Obteniendo una instancia del boton show_pet_button
show_pet_button = (Button)findViewById(R.id.show_pet_button);
//Registrando la escucha sobre la actividad Main
show_pet_button.setOnClickListener(this);
}
@Override
public void onClick(View v){
//Iniciando la actividad Visor
Intent intent = new Intent(this,Visor.class);
startActivity(intent);
}
}
Enviar datos hacia una actividad
putExtra(). Este método es polimorfico y es capaz de enviar varios tipos de datos."pet1.jpg". Para ello agregaremos un TextView que mostrará la cadena en su atributo text.public final static String EXTRA_NOMBRE = "TUPAQUETE.petmotion.NOMBRE";
Es importante encontrar una cadena que sea única para que no interfiera con otros datos, por eso elegimos el nombre del paquete de nuestro proyecto para asegurarnos que no se repita. Ahora solo queda implementar el método putExtra() antes de iniciar la actividad:
//Iniciando la actividad Visor
Intent intent = new Intent(this,Visor.class);
//Adhesión de nuestra cadena
intent.putExtra(EXTRA_NOMBRE,"pet1.jpg");
startActivity(intent);
Ammm! . . . ¿y como recibo ese Extra desde otra actividad?
getIntent() de la clase Activity y obtendremos el intent que inicio la actividad. Todos las actividades son iniciadas por un intent, incluso podemos obtener el Intent de la actividad principal iniciado por el sistema.onCreate() de Visor obtendremos el intent. Luego extraeremos la cadena del mensaje que enviamos con getStringExtra() y se la asignaremos al atributo text del TextView://Obteniendo la instancia del TextView
image_name = (TextView)findViewById(R.id.image_name);
//Obteniendo la instancia del Intent
Intent intent = getIntent();
//Extrayendo el extra de tipo cadena
String name = intent.getStringExtra(Main.EXTRA_NOMBRE);
//Seteando el valor del extra en el TextView
image_name.setText(name);
Al ejecutar obtendremos el siguiente resultado:

Iniciar una aplicación externa desde nuestra actividad
Intents Explícitos
Visor.java y no ninguna otra. Lo que significa que se hizo explicita la asociación del Intent a esta acción.Intents Implicitos
Iniciar un navegador web Android desde nuestra actividad
TextView en la parte inferior del RelativeLayout con el mensaje "Autores" y la enlazaremos al Home de Hermosa Programación.Uri webpage = Uri.parse("http://hermosaprogramacion.blogspot.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
startActivity(webIntent);
¿Se ve sencillo de entender, no?
Y lo es!...en estas lineas se encuentra uno de los poderes mas maravillosos del desarrollo Android.
En la primera línea vemos el uso de la clase Uri del paquete import android.net.Uri. Este nueva instancia es clave para especificar el sitio web que deseamos visualizar. Si recuerdas el concepto de URI sabrás que debemos incluir un identificador con un formato esquematizado.
Obtendremos un nuevo objeto Uri a través de la URL de nuestro home(una URL es una URI, recuerdalo).
El método parse() solo traduce el formato, interpreta el esquema y produce los datos necesarios para el Intent.
Luego se crea una nueva instancia de nuestro intent llamado webIntent y esta vez inicializamos en linea con un constructor nuevo. Su primer parámetro es una constate que indica la acción genérica que deseamos realizar. El segundo parámetro es la URI que representa el mensaje a interpretar.
En el primer parámetro usamos la constante Intent.ACTION_VIEW. Esta representa la visualización de contenido, en este caso una página web asociada a un esquema de datos URI. Sin embargo hay muchas mas constantes asignadas a otras acciones estándar de Android. A continuación te presento una tabla descriptiva sobre cada acción para que las tengas en cuenta:
ACTION_MAIN ACTION_VIEW ACTION_ATTACH_DATA ACTION_EDIT ACTION_PICK ACTION_CHOOSER ACTION_GET_CONTENT ACTION_DIAL ACTION_CALL ACTION_SEND ACTION_SENDTO ACTION_ANSWER ACTION_INSERT ACTION_DELETE ACTION_RUN ACTION_SYNC ACTION_PICK_ACTIVITY ACTION_SEARCH ACTION_WEB_SEARCH ACTION_FACTORY_TEST putExtra() para ingresar parámetros necesarios para el funcionamiento. En otros artículos podremos ver mas sobre estas acciones y detallar su funcionamiento con ejemplos.startActivity(). Solo se pasa como parámetro el intent recién creado y corremos nuestra aplicación.TextView se ejecutará el Navegador de Android.// Verificar si hay aplicaciones disponibles
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(webIntent, 0);
boolean isIntentSafe = activities.size() > 0;
// Si hay, entonces ejecutamos la actividad
if (isIntentSafe) {
startActivity(webIntent);
}
No entraremos en detalle sobre esta implementación, pero a simple vista podemos notar que estamos llamando a PackageManager. Esta entidad puede proporcionarnos aquellos elementos que respondieron al intent con el método queryIntentActivities(). Luego comprobamos si al menos uno fue retornado, si fue así entonces iniciamos la actividad.
Recibir datos de una actividad
RadioGroup para la selección de opciones y un botón para enviar. Si no sabes nada sobre este View, no te preocupes, la siguiente definición te ayudará.¿Qué es un RadioGroup?
RadioGroup es un ViewGroup cuyo contenido esta destinado a albergar RadioButtons. Un RadioButton es un botón circular que visualmente representa dos estados. Uno de selección y otro de inactividad. Dependiendo del estado la aplicación actuará.RadioButton dentro de un RadioGroup inmediatamente su estado obedecerá a una múltiple exclusión entre todos los elementos que habiten en el contenedor. Lo que quiere decir, que si hay 3 radios, solo uno podrá estar en estado de selección, los otros 2 restantes deben mantener muertos. RadioGroup a nuestra actividad Visor iremos a la Paleta del editor de diseño, buscaremos la categoría Containers y luego arrastraremos uno:match_parent, a su id le asignaremos "opiniones_group" y le cambiaremos su atributo orientation a vertical. orientation controla la orientación que tendrá los radios cuando los insertemos como hijos.opiniones_group:text de los radiobuttons.ImageView alineado al borde derecho del grupo. También lo centre verticalmente y alineado a la izquierda del RelativeLayout.<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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="TUPAQUETE.petmotion.Visor">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/pet1"
android:layout_alignParentRight="true"
android:layout_toRightOf="@+id/opiniones_group"
android:layout_below="@+id/image_name"
android:layout_centerVertical="true"
android:layout_above="@+id/send_button"
android:layout_marginLeft="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/image_name"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true" />
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/opiniones_group"
android:orientation="vertical"
android:layout_marginTop="75dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/radio_button1"
android:id="@+id/radio_hermoso" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/radio_button2"
android:id="@+id/radio_lindo" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/radio_button3"
android:id="@+id/radio_normal" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/radio_button4"
android:id="@+id/radio_horroroso" />
</RadioGroup>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
and