Beruflich Dokumente
Kultur Dokumente
Mensajes como iniciar una actividad, realizar una llamada, acceder a un Broadcast
y muchas más.
Luego sigue “Layout Name” que hace referencia al nombre del layout de la
actividad. Dejaremos su valor actual recomendado por Android Studio.
Si habilitamos esta opción podremos hacer uso del Up Button. Este botón es
autogenerado por las aplicaciones Android cuando deseamos regresar de una
actividad a otra. Normalmente se encuentra en la parte superior izquierda de la
cabecera.
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Main">
<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="co.edu.unilibre.mostrarciudad.Main" />
</activity>
</application>
</manifest>
<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/mostrar_ciudad_button"
android:id="@+id/mostrat_ciudad_button"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
El objetivo de usar este componente se debe a que deseamos añadir una foto de
una mascota en la actividad Visor. La idea es que el usuario presione el botón
mostrar_ciudad_button de Main y sea dirigido a Visor para visualizar la imagen.
<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="co.edu.unilibre.mostrarciudad.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="@mipmap/ciudad" />
</RelativeLayout>
...
//Crear un nuevo intent
Intent intent = new Intent(this,Visor.class);
//Iniciar actividad
startActivity(intent);
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public void onClick(View v){
Antes de iniciar la actividad debemos adherir los datos al intent con el método
putExtra(). Este método es polimórfico y es capaz de enviar varios tipos de datos.
Para mostrar su uso vamos a suponer que por alguna razón que necesitamos enviar
una cadena desde la actividad principal hasta el visor. Esta cadena será el nombre
de la imagen que se va a mostrar, que es este caso es “ciudad.png”. Para ello
agregaremos un TextView que mostrará la cadena en su atributo text.
Ahora dentro de la nuestra actividad Main declararemos una constante de tipo String
que represente el identificador único del dato Extra para nuestro Intent. Esto nos
permitirá diferenciar de otros pares:
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:
Todo esto suena muy emocionante, pero antes de proseguir aclararemos que tipos
de comportamiento puede llegar a tomar un Intent al iniciar otro componente.
INTENTS EXPLÍCITOS
Cuando un intent se crea para enviar un mensaje a un componente específico se le
llama Intent explícito. Por ejemplo, cuando iniciamos otra actividad en el ejemplo
anterior, sabíamos previamente que la actividad era Visor.java y no ninguna otra.
Lo que significa que se hizo explicita la asociación del Intent a esta acción.
INTENTS IMPLICITOS
Un intent se comporta implícitamente cuando no se sabe con exactitud que
componente se iniciará para recibir el mensaje que vamos a enviar. Aunque no se
sabe específicamente, si se tiene claro cuál debe ser el propósito del componente
que sea iniciado.
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, recuérdalo).
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 línea 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.
¿QUÉ ES UN RADIOGROUP?
Ahora insertaremos dentro del RadioGroup cuatro RadioButtons. Arrastra los radios
desde la categoría Widgets hasta el interior del opiniones_group:
Una vez terminada esta tarea deberíamos tener algo como esto:
<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="co.edu.unilibre.mostrarciudad.Visor">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@mipmap/ciudad"
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
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/send_button"
android:id="@+id/send_button"
android:layout_alignParentTop="false"
android:layout_centerHorizontal="true"
android:layout_marginTop="51dp"
android:layout_alignParentBottom="true" />
</RelativeLayout>
//Código de envío
public final static int OPINION_REQUEST_CODE = 1;
...
//Iniciando la actividad Visor
Intent intent = new Intent(this, Visor.class);
//Adhesion de nuestra cadena
intent.putExtra(EXTRA_NOMBRE, "ciudad.png");
//Inicio de la actividad esperando un resultado
startActivityForResult(intent,OPINION_REQUEST_CODE);
Listo!, con esa modificación nuestra petición está en camino. Ahora veamos como
devolver desde Visor la cadena del RadioButton que actualmente esta seleccionado
al presionar el botón “Enviar”:
@Override
public void onClick(View v){
//Terminar la actividad
finish();
En este método comprobaremos que todo esté bien y luego obtendremos los datos
del intent de respuesta.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == OPINION_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
String result=data.getStringExtra("opinion");
}
}
Si todo salió bien y seguiste los pasos expuestos con anterioridad, tendremos una
actividad Main con la siguiente lógica:
package co.edu.unilibre.mostrarciudad;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.net.Uri;
import android.widget.TextView;
import android.content.pm.PackageManager;
import java.util.List;
//Código de envío
public final static int OPINION_REQUEST_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mostrar_ciudad_button =
(Button)findViewById(R.id.mostrar_ciudad_button);
mostrar_ciudad_button.setOnClickListener(this);
opinion_text = (TextView)findViewById(R.id.opinion_text);
@Override
public void onClick(View v) {
Intent intent = new Intent(this, Visor.class);
intent.putExtra(EXTRA_NOMBRE,"ciudad.png");
//startActivity(intent);
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == OPINION_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
String result=data.getStringExtra("opinion");
}
}
}
Nuestro archivo layout activity_main.xml se vería asi:
<Button
android:id="@+id/mostrar_ciudad_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
android:layout_centerVertical="true"
android:onClick="onClick"
android:text="@string/mostrar_ciudad_button" />
<TextView
android:id="@+id/autores"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_marginBottom="42dp"
android:layout_marginEnd="53dp"
android:clickable="true"
android:focusable="true"
android:onClick="onClick1"
android:text="@string/autores" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/opinion_text"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
import android.widget.Button;
public class Visor extends AppCompatActivity implements
View.OnClickListener {
private BottomNavigationView.OnNavigationItemSelectedListener
mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener()
{
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
mTextMessage.setText(R.string.title_home);
return true;
case R.id.navigation_dashboard:
mTextMessage.setText(R.string.title_dashboard);
return true;
case R.id.navigation_notifications:
mTextMessage.setText(R.string.title_notifications);
return true;
}
return false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_visor);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedL
istener);
}
@Override
public void onClick(View v){
//Terminar la actividad
finish();
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="0dp"
android:layout_marginStart="0dp"
android:background="?android:attr/windowBackground"
app:menu="@menu/navigation" />
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="99dp"
android:contentDescription="@string/todo"
app:srcCompat="@mipmap/ciudad" />
<TextView
android:id="@+id/image_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp"
android:text="@string/imagen" />
<RadioGroup
android:id="@+id/opiniones_group"
android:layout_width="204dp"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_marginBottom="104dp"
android:layout_marginStart="29dp"
android:orientation="vertical">
<RadioButton
android:id="@+id/radioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hermosa" />
<RadioButton
android:id="@+id/radioButton2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/linda" />
<RadioButton
android:id="@+id/radioButton3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/normal" />
<RadioButton
android:id="@+id/radioButton4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/horrorosa" />
</RadioGroup>
<Button
android:id="@+id/send_button"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="false"
android:layout_centerHorizontal="true"
android:layout_marginTop="51dp"
android:onClick="onClick"
android:text="@string/enviar" />
</RelativeLayout>
CONCLUSIÓN
Iniciar una actividad desde otra y comunicar datos entre ellas, son acciones básicas
que se ven frecuentemente en los desarrollos Android.
Recuerda a los Intents como una especie de mensajes que hacen de puente entre
los componentes de una aplicación. Sin ellos, las interacciones complejas entre el
entorno no serían posibles.
Es importante que tengas en cuenta la experiencia de usuario en el inicio de nuevas
actividades y la forma en que organizas las acciones de tus views para este
cometido.