Pasar datos entre actividades
o fragmentos
es uno de los conceptos básicos que necesitas aprender cuando empiezas a hacer desarrollo en android. Aunque las actividades
y los fragmentos
no son más que clases, se consideran clases especiales en android ya que son fundamentales para el funcionamiento de la interfaz de usuario de android. Por lo tanto, no sólo les pasamos datos a través de los constructores, sino de una de las siguientes tres maneras:
Intent
.Bundle
- ViewModel
En esta lección veremos todo esto con ejemplos prácticos. Empecemos.
Ejemplo 1: Paso de datos en Android - Fragment
a Activity
vía `Intent
Vamos a continuar con nuestra serie de paso de datos en Android que habíamos empezado antes, hemos visto cómo pasar datos de activity
a fragment
y cómo pasar tanto una lista/objeto de activity
a activity
como tipos de datos primitivos simples.
Hoy veremos cómo pasar tipos de datos simples desde el fragment
a activity
.Pasamos los datos a través del objeto Intent
.
¿Qué es un Fragment
?
Un "fragmento" es una subactividad con su propio ciclo de vida. Los fragmentos son alojados por "actividades". Una "actividad" puede alojar varios "fragmentos".
¿Por qué pasar los datos del "fragmento" a la "actividad"?
No. | Razón |
---|---|
1. | Los fragmentos son subactividades y nos permiten tener diferentes pantallas sin tener que crear necesariamente muchas "actividades". De ahí que necesitemos saber cómo pasar los datos del fragmento a una actividad . |
2. | Los fragmentos como Activities son clases especiales de UI que representan una ventana y por lo tanto no podemos pasar datos directamente como hacemos con las clases ordinarias. |
Introducción
- Tenemos dos clases: una nuestra
MainActivity
y otra una claseMyFragment
. - Cuando pulsamos el botón FAB (Floating Action Button), abrimos el MyFragment a través de la transacción
Fragment
, adjuntándolo a un FrameLayout que definiremos. - El
Fragment
contiene un texto de edición y un spinner. - El usuario teclea el nombre de la nave y elige el año de lanzamiento en el spinner.
- Luego pasamos ambos datos a la MainActivity.
- A continuación, mostrar los datos recibidos en textviews.
- Hemos utilizado Android Studio como nuestro IDE.
- El código está bien comentado para facilitar su comprensión.
Preguntas comunes que respondemos
Con este sencillo ejemplo exploramos lo siguiente :
- Cómo pasar datos desde
fragment
a unaactivity
. - Cómo paso datos entre
fragment
yactivity
usando intents. - Cómo realizo FragmentTransaction.
- Anular onResume() y recibir datos en android.
- Cómo trabajar tanto con
fragment
como conactivity
.
Herramientas utilizadas
- IDE : Android Studio
- OS : Windows 8.1
- PLATAFORMA : Android
- LENGUAJE : Java
- TEMA :
Intent
,Data Passing,Fragment
Vamos.
Echemos un vistazo al código fuente.
1. Build.gradle
- No se necesitan dependencias externas.
2. MainActivity.java
- Nuestro
MainActivity
, lanzadoractivity
. - Primero referenciamos las vistas aquí, en este caso simples textviews para mostrar nuestros datos recibidos.
- Tenemos un método: receiveData() que se encarga de recibir y desempaquetar los datos que recibimos de la clase
MyFragment
. - Recibiremos los datos en el método onResume().
- Debido a que el método es llamado no sólo cuando reanudamos desde el
fragment
sino también después de que la [activity
](https://camposha.info/android/activity) ha sido creada e iniciada, necesitaremos identificar al llamante usando una simple cadena de remitente que enviaremos cada vez que enviemos datos desde el
fragment`. - Si el remitente es
MiFragmento
, entonces seguimos adelante y desempaquetamos nuestros datos.
package com.tutorials.hp.datafragment_activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private TextView nameTxt,yearTxt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//REFERENCE VIEWS
nameTxt= (TextView) findViewById(R.id.nameTxt);
yearTxt= (TextView) findViewById(R.id.yearTxt);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openFragment();
}
});
}
/*
WHEN ACTIVITY RESUMES
*/
@Override
protected void onResume() {
super.onResume();
//DETERMINE WHO STARTED THIS ACTIVITY
final String sender=this.getIntent().getExtras().getString("SENDER_KEY");
//IF ITS THE FRAGMENT THEN RECEIVE DATA
if(sender != null)
{
this.receiveData();
Toast.makeText(this, "Received", Toast.LENGTH_SHORT).show();
}
}
/*
OPEN FRAGMENT
*/
private void openFragment()
{
//PASS OVER THE BUNDLE TO OUR FRAGMENT
MyFragment myFragment = new MyFragment();
//THEN NOW SHOW OUR FRAGMENT
getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();
}
/*
RECEIVE DATA FROM FRAGMENT
*/
private void receiveData()
{
//RECEIVE DATA VIA INTENT
Intent i = getIntent();
String name = i.getStringExtra("NAME_KEY");
int year = i.getIntExtra("YEAR_KEY",0);
//SET DATA TO TEXTVIEWS
nameTxt.setText(name);
yearTxt.setText(String.valueOf(year));
}
}
3. MiFragmento.java
- Nuestra clase
Fragment
. - Estamos usando la librería de soporte
Fragment
así que extendemosandroid.support.v4.app.
Fragment``. - Aquí tenemos un texto de edición, un botón y un spinner.
- El usuario debe introducir el nombre de la nave en el texto de edición, seleccione el año de lanzamiento en el spinner y haga clic en el botón de envío para enviar los datos a MainActivity.
- Enviamos y empaquetamos los datos en un
intent
. - También enviamos una variable que llamamos sender para identificar el remitente de esos datos como este
fragment
.
package com.tutorials.hp.datafragment_activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
/
* A simple Fragment subclass.
*/
public class MyFragment extends Fragment {
private EditText nameFragTxt;
private Spinner launchYearSpinner;
private Button sendBtn;
public MyFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView=inflater.inflate(R.layout.fragment_my, container, false);
//INITIALIZE VIEWS
nameFragTxt = (EditText)rootView.findViewById(R.id.nameEditTxt);
launchYearSpinner = (Spinner)rootView.findViewById(R.id.sp);
sendBtn = (Button) rootView.findViewById(R.id.sendBtn);
fillYears();
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendData();
}
});
return rootView;
}
/*
FILL YEARS IN OUR SPINNER
*/
private void fillYears() {
ArrayAdapter adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1);
adapter.add("2017");
adapter.add("2018");
adapter.add("2019");
adapter.add("2020");
adapter.add("2021");
adapter.add("2022");
//SET ADAPTER INSTANCE TO OUR SPINNER
launchYearSpinner.setAdapter(adapter);
}
private void sendData()
{
//INTENT OBJ
Intent i = new Intent(getActivity().getBaseContext(),
MainActivity.class);
//PACK DATA
i.putExtra("SENDER_KEY", "MyFragment");
i.putExtra("NAME_KEY", nameFragTxt.getText().toString());
i.putExtra("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));
//RESET WIDGETS
nameFragTxt.setText("");
launchYearSpinner.setSelection(0);
//START ACTIVITY
getActivity().startActivity(i);
}
}
4. Crear interfaces de usuario
Las interfaces de usuario son típicamente creadas en android usando diseños XML en lugar de codificación java directa.
Este es un ejemplo de programación declarativa.
Ventajas del uso de XML sobre Java
No. | Ventaja | ||
---|---|---|---|
1. | La creación declarativa de widgets y vistas nos permite utilizar un lenguaje declarativo XML que lo hace más fácil. | ||
2. | Es fácilmente mantenible ya que la interfaz de usuario está desacoplada de su lógica Java. | ||
3. | Es más fácil compartir o descargar el código y probarlo con seguridad antes del tiempo de ejecución. | ||
4. | Se pueden utilizar herramientas generadoras de XML para generar XML | . |
Aquí están nuestros diseños para este proyecto:
(a). activity_main.xml
- Este diseño se infla a la interfaz de usuario MainActivity.
- Incluye el content_main.xml.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_fitsSystemWindows="true"
tools_context="com.tutorials.hp.datafragment_activity.MainActivity">
<android.support.design.widget.AppBarLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android_id="@+id/toolbar"
android_layout_width="match_parent"
android_layout_height="?attr/actionBarSize"
android_background="?attr/colorPrimary"
app_popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<android.support.design.widget.FloatingActionButton
android_id="@+id/fab"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_gravity="bottom|end"
android_layout_margin="@dimen/fab_margin"
app_srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
Estos son algunos de los widgets, vistas y viewgroups que se emplean"
No. | Vista/grupo de vista | Paquete | Rol |
---|---|---|---|
1. | CordinatorLayout | android.support.design.widget |
Framelayout superpotente que proporciona la decoración de nivel superior de nuestra aplicación y también especifica las interacciones y comportamientos de todos sus hijos. |
2. | AppBarLayout | android.support.design.widget |
Un hijo de LinearLayout que organiza sus hijos verticalmente y proporciona conceptos de barra de aplicación de material design como gestos de desplazamiento. |
3. | Un ViewGroup | que puede proporcionar las características de la barra de acción y aún así ser utilizado dentro de los diseños de la aplicación. | |
4. | Un botón de acción flotante | android.support.design.widget es una imagen circular que flota por encima de la interfaz de usuario y que podemos utilizar como botones. |
(b). content_main.xml
Este diseño se incluye en tu activity_main.xml.
Aquí definimos nuestros widgets de UI.
- Layout principal.
- Especificamos el código de Views y widgets xml aquí.
- Este diseño se infla en nuestra interfaz MainActivity.
- Es el layout contentmain.xml de nuestro proyecto.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_id="@+id/content_main"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
app_layout_behavior="@string/appbar_scrolling_view_behavior"
tools_context="com.tutorials.hp.datafragment_activity.MainActivity"
tools_showIn="@layout/activity_main">
<LinearLayout
android_layout_width="match_parent"
android_orientation="vertical"
android_layout_height="match_parent">
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Received Data"
android_id="@+id/activityTitle"
android_textStyle="bold"
android_textColor="@color/colorAccent"
android_layout_gravity="center_horizontal"
android_padding="5dp"
/>
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Name"
android_id="@+id/nameTxt"
android_padding="5dp"
/>
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Year"
android_id="@+id/yearTxt"
android_padding="5dp"
/>
<FrameLayout
android_id="@+id/container"
android_layout_width="match_parent"
android_layout_height="wrap_content">
</FrameLayout>
</LinearLayout>
</RelativeLayout>
(c). Diseño de MiFragmento
- Layout para nuestra clase
Fragment
. - Contiene una CardView con un texto de edición y un spinner.
- Es el layout fragment_my.xml de nuestro proyecto
<FrameLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
tools_context="com.tutorials.hp.datafragment_activity.MyFragment">
<android.support.v7.widget.CardView
android_orientation="horizontal"
android_layout_width="match_parent"
android_layout_margin="5dp"
card_view_cardCornerRadius="10dp"
card_view_cardElevation="5dp"
android_layout_height="300dp">
<LinearLayout
android_orientation="vertical"
android_layout_width="match_parent"
android_layout_height="match_parent">
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="FRAGMENT ONE"
android_id="@+id/fragTitle"
android_textStyle="bold"
android_textColor="@color/colorAccent"
android_layout_gravity="center_horizontal"
android_padding="5dp"
/>
<android.support.design.widget.TextInputLayout
android_id="@+id/nameLayout"
android_layout_width="match_parent"
android_layout_height="wrap_content">
<EditText
android_id="@+id/nameEditTxt"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_singleLine="true"
android_hint= "Name" />
</android.support.design.widget.TextInputLayout>
<LinearLayout
android_layout_width="match_parent"
android_orientation="horizontal"
android_layout_height="wrap_content">
<TextView
android_text="LAUNCH YEAR : "
android_textColor="@color/colorAccent"
android_layout_width="wrap_content"
android_layout_height="wrap_content" />
<Spinner
android_id="@+id/sp"
android_layout_width="match_parent"
android_layout_height="wrap_content"
/>
</LinearLayout>
<Button
android_id="@+id/sendBtn"
android_text="Send"
android_layout_width="wrap_content"
android_layout_height="wrap_content" />
</LinearLayout>
</android.support.v7.widget.CardView>
</FrameLayout>
Cómo ejecutar
- Descargue el proyecto anterior.
- Obtendrás un archivo comprimido, extráelo.
- Abra el Android Studio.
- Ahora cierra, cualquier proyecto ya abierto
- Desde la barra de menú haz clic en Archivo >Nuevo> Importar Proyecto
- Ahora elija una carpeta de destino, desde donde desea importar el proyecto.
- Elija un proyecto Android.
- Ahora haga clic en "Aceptar".
- Listo, ya has terminado de importar el proyecto, ahora edítalo.
Resultado
Esto es lo que obtendrá:
Más recursos
Recurso | Enlace. |
---|---|
GitHub Download Link | Download |
Ejemplo 2: Paso de datos en Android - De Activity
a Fragment
vía Bundle
Al desarrollar cualquier aplicación que no sea un Hello World, entonces es probable que necesites tener más de una Activity
o Fragments.Fragments básicamente son subactividades.
La mayoría de los novatos se confunden al pasar datos entre actividades
o entre fragmentos
.
Hoy queremos ver cómo pasar datos de una actividad
a un fragmento
. Utilizaremos un objeto Bundle
, le empaquetaremos datos en nuestra Activity
, y luego desempaquetaremos esos datos dentro del método onCreateView() de nuestro Fragment
.
PASO 1 : Crear Proyecto
- Primero crea un nuevo proyecto en android studio. Ve a Archivo --> Nuevo Proyecto.
- Escribe el nombre de la aplicación y elige el nombre de la empresa.
- Elige el SDK mínimo.
- Elegir
actividad
vacía o básica. - Haga clic en Finalizar.
PASO 2 : Nuestro Build.gradle
- Vamos a utilizar una CardView en nuestro
Fragment
. No se necesitan dependencias externas.
PASO 3 : Nuestro Fragmento
- Se inflará a partir de nuestro
fragment
layout. - Simplemente recibiremos los datos enviados desde MainActivity y los mostraremos en nuestras vistas dentro de nuestro
fragment
. - Desempaquetamos los datos en nuestro método onCreateView().
package com.tutorials.hp.dataactivity_fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class MyFragment extends Fragment {
private TextView nameFragTxt,yearFragTxt;
public MyFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView=inflater.inflate(R.layout.fragment_my, container, false);
nameFragTxt= (TextView) rootView.findViewById(R.id.nameTxt);
yearFragTxt= (TextView) rootView.findViewById(R.id.yearTxt);
//UNPACK OUR DATA FROM OUR BUNDLE
String name=this.getArguments().getString("NAME_KEY").toString();
int year=this.getArguments().getInt("YEAR_KEY");
nameFragTxt.setText("NAME : "+name);
yearFragTxt.setText("YEAR : "+String.valueOf(year));
return rootView;
}
}
PASO 4 : Nuestra MainActivity
- Se inflará desde nuestro contentmain.xml
- Cuando el usuario hace clic en el Botón de Acción Flotante empaquetamos los datos escritos por el usuario en el edittext y el spinner en un objeto
Bundle
. - Luego realizamos nuestra transacción
Fragment
, reemplazando nuestro contenedor Framelayout con nuestrofragment
inflado. - Enviamos el bundle al
Fragment
.
package com.tutorials.hp.dataactivity_fragment;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
public class MainActivity extends AppCompatActivity {
private EditText nameTxt;
private Spinner launchYearSpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//INITIALIZE VIEWS
nameTxt = (EditText) findViewById(R.id.nameEditTxt);
launchYearSpinner = (Spinner) findViewById(R.id.sp);
fillYears();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendData();
}
});
}
/*
SEND DATA TO FRAGMENT
*/
private void sendData() {
//PACK DATA IN A BUNDLE
Bundle bundle = new Bundle();
bundle.putString("NAME_KEY", nameTxt.getText().toString());
bundle.putInt("YEAR_KEY", Integer.valueOf(launchYearSpinner.getSelectedItem().toString()));
//PASS OVER THE BUNDLE TO OUR FRAGMENT
MyFragment myFragment = new MyFragment();
myFragment.setArguments(bundle);
nameTxt.setText("");
launchYearSpinner.setSelection(0);
//THEN NOW SHOW OUR FRAGMENT
getSupportFragmentManager().beginTransaction().replace(R.id.container,myFragment).commit();
}
/*
FILL YEARS IN OUR SPINNER
*/
private void fillYears() {
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
adapter.add("2017");
adapter.add("2018");
adapter.add("2019");
adapter.add("2020");
adapter.add("2021");
adapter.add("2022");
//SET ADAPTER INSTANCE TO OUR SPINNER
launchYearSpinner.setAdapter(adapter);
}
}
PASO 5. Crear la interfaz de usuario Activity
Las interfaces de usuario son típicamente creadas en android usando diseños XML en lugar de codificación java directa.
Este es un ejemplo de programación declarativa.
**Ventajas del uso de XML sobre Java
No. | Ventaja |
---|---|
1. | La creación declarativa de widgets y vistas nos permite utilizar un lenguaje declarativo XML que lo hace más fácil. |
2. | Es fácilmente mantenible ya que la interfaz de usuario está desacoplada de su lógica Java. |
3. | Es más fácil compartir o descargar el código y probarlo con seguridad antes del tiempo de ejecución. |
4. | Se pueden utilizar herramientas de generación de XML |
Aquí están nuestros diseños para este proyecto:
(a). activity_main.xml
- Este diseño se infla a la interfaz de usuario MainActivity.
- Incluye el content_main.xml.
Estos son algunos de los widgets, vistas y viewgroups que se emplean"
No. | Vista/grupo de vista | Paquete | Rol |
---|---|---|---|
1. CordinatorLayout |
android.support.design.widget |
Super-powered framelayout que proporciona la decoración de nivel superior de nuestra aplicación y también especifica las interacciones y comportamientos de todos sus hijos. |
|
2. AppBarLayout |
android.support.design.widget |
Un hijo de LinearLayout que organiza sus hijos verticalmente y proporciona conceptos de barra de aplicación de material design como gestos de desplazamiento. | |
3. | Un ViewGroup | que puede proporcionar las características de la barra de acción y aún así ser utilizado dentro de los diseños de la aplicación. | |
4. | Un botón de acción flotante que puede ser utilizado como botón. |
(b). content_main.xml
Este diseño se incluye en tu activity_main.xml.
Aquí definimos nuestros widgets de UI.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
app_layout_behavior="@string/appbar_scrolling_view_behavior"
tools_context="com.tutorials.hp.dataactivity_fragment.MainActivity"
tools_showIn="@layout/activity_main">
<LinearLayout
android_layout_width="match_parent"
android_orientation="vertical"
android_layout_height="match_parent">
<android.support.design.widget.TextInputLayout
android_id="@+id/nameLayout"
android_layout_width="match_parent"
android_layout_height="wrap_content">
<EditText
android_id="@+id/nameEditTxt"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_singleLine="true"
android_hint= "Name" />
</android.support.design.widget.TextInputLayout>
<LinearLayout
android_layout_width="match_parent"
android_orientation="horizontal"
android_layout_height="wrap_content">
<TextView
android_text="LAUNCH YEAR : "
android_textColor="@color/colorAccent"
android_layout_width="wrap_content"
android_layout_height="wrap_content" />
<Spinner
android_id="@+id/sp"
android_layout_width="match_parent"
android_layout_height="wrap_content"
/>
</LinearLayout>
<FrameLayout
android_id="@+id/container"
android_layout_width="match_parent"
android_layout_height="wrap_content">
</FrameLayout>
</LinearLayout>
</RelativeLayout>
PASO 6 : Nuestro Fragment
xml
- Nuestro
fragment
layout. - Contendrá una CardView con textviews.
<RelativeLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
tools_context="com.tutorials.hp.dataactivity_fragment.MyFragment">
<android.support.v7.widget.CardView
android_orientation="horizontal"
android_layout_width="match_parent"
android_layout_margin="5dp"
card_view_cardCornerRadius="10dp"
card_view_cardElevation="5dp"
android_layout_height="300dp">
<LinearLayout
android_orientation="vertical"
android_layout_width="match_parent"
android_layout_height="match_parent">
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="FRAGMENT ONE"
android_id="@+id/fragTitle"
android_textStyle="bold"
android_textColor="@color/colorAccent"
android_layout_gravity="center_horizontal"
android_padding="5dp"
/>
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Name"
android_id="@+id/nameTxt"
android_padding="5dp"
/>
<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_textAppearance="?android:attr/textAppearanceLarge"
android_text="Year"
android_id="@+id/yearTxt"
android_padding="5dp"
/>
</LinearLayout>
</android.support.v7.widget.CardView>
</RelativeLayout>
PASO 7 : Cómo ejecutar
- Descargue el proyecto.
- Obtendrás un archivo comprimido, extráelo.
- Abra el Android Studio.
- Ahora cierra, cualquier proyecto ya abierto
- Desde la barra de menú haz clic en Archivo >Nuevo> Importar Proyecto
- Ahora elija una carpeta de destino, desde donde desea importar el proyecto.
- Elija un proyecto Android.
- Ahora haga clic en "Aceptar".
- Hecho, ahora edítalo..
Resultado
Esto es lo que obtienes:
PASO 8 : Más
Recurso | Enlace |
---|---|
GitHub Browse Navegar | |
GitHub Download Link | Download |
Android Data Passing : ListView to ListView
A veces puedes querer pasar datos de un listview en la Actividad
A a un ListView en, digamos, la Actividad
B. Bueno, ese es el propósito de este tutorial.
Tendremos dos Activities, cada una con un ListView. Pulsamos un botón y pasamos los datos de la primera actividad
a la segunda actividad
, el primer litsview al segundo listview.
Scripts de Gradle
Vamos a modificar nuestro archivo build.gradle
a nivel de aplicación.
1. Build.gradle
2. Especificamos las dependencias bajo el cierre de dependencias.
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.tutorials.hp.listviewdatapassing"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support:design:25.2.0'
testCompile 'junit:junit:4.12'
}
LAYOUTS
Tendremos tres diseños:
1. activity_main.xml
- Este layout se inflará en la UI para nuestra mainactivity.
- Contendrá el diseño
content_main.xml
. - Contiene las definiciones de nuestra barra de aplicaciones y barras de herramientas.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_fitsSystemWindows="true"
tools_context="com.tutorials.hp.listviewdatapassing.MainActivity">
<android.support.design.widget.AppBarLayout
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android_id="@+id/toolbar"
android_layout_width="match_parent"
android_layout_height="?attr/actionBarSize"
android_background="?attr/colorPrimary"
app_popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" />
<android.support.design.widget.FloatingActionButton
android_id="@+id/fab"
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_gravity="bottom|end"
android_layout_margin="@dimen/fab_margin"
app_srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout>
2. content_main.xml
- Este contendrá nuestro primer ListView.
- Este layout se incluye dentro del
activity_main.xml
.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_id="@+id/content_main"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
app_layout_behavior="@string/appbar_scrolling_view_behavior"
tools_context="com.tutorials.hp.listviewdatapassing.MainActivity"
tools_showIn="@layout/activity_main">
<ListView
android_id="@+id/firstLV"
android_layout_width="match_parent"
android_layout_height="wrap_content" />
</RelativeLayout>
3. activity_second.xml
- Este layout será inflado en la UI para nuestra segunda
actividad
. - Contendrá la segunda
actividad
.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android_id="@+id/activity_second"
android_layout_width="match_parent"
android_layout_height="match_parent"
android_paddingBottom="@dimen/activity_vertical_margin"
android_paddingLeft="@dimen/activity_horizontal_margin"
android_paddingRight="@dimen/activity_horizontal_margin"
android_paddingTop="@dimen/activity_vertical_margin"
tools_context="com.tutorials.hp.listviewdatapassing.SecondActivity">
<ListView
android_id="@+id/secondLV"
android_layout_width="match_parent"
android_layout_height="wrap_content"
/>
</RelativeLayout>
CLASES JAVA
Aquí están nuestras clases java:
1. SpacecraftsCollection
- Esta es la clase que nos ayudará a transferir nuestro ArrayList de la primera a la segunda
actividad
. Esta clase será serializada, transferida y luego deserializada en la segundaactividad
.
package com.tutorials.hp.listviewdatapassing;
import java.io.Serializable;
import java.util.ArrayList;
public class SpacecraftsCollection implements Serializable {
private ArrayList<String> spacecrafts;
public ArrayList<String> getSpacecrafts() {
return spacecrafts;
}
public void setSpacecrafts(ArrayList<String> spacecrafts) {
this.spacecrafts = spacecrafts;
}
}
2. SecondActivity.java
- Esta es nuestra segunda clase
activity
. - Recibirá un arraylist serializado que contiene nuestras naves espaciales y lo deserializará y mostrará en el segundo listview.
package com.tutorials.hp.listviewdatapassing;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class SecondActivity extends AppCompatActivity {
//SECOND LISTVIEW
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
lv= (ListView) findViewById(R.id.secondLV);
receiveData();
}
/*
RECEIVE DATA FROM FIRST ACTIVITY
*/
private void receiveData()
{
Intent i=this.getIntent();
SpacecraftsCollection spacecraftsCollection= (SpacecraftsCollection) i.getSerializableExtra("SPACECRAFTS");
lv.setAdapter(new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,spacecraftsCollection.getSpacecrafts()));
}
}
3. MainActivity.java
- Nuestra clase MainActivity.
- Los datos de nuestro arraylist serán transferidos desde aquí a la segunda
actividad
cuando se pulse el botón de acción flotante.
package com.tutorials.hp.listviewdatapassing;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
//FIRST LISTVIEW
ListView lv;
ArrayList spacecrafts=new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
lv= (ListView) findViewById(R.id.firstLV);
populateData();
lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,spacecrafts));
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,new ArrayList<String>()));
sendData();
}
});
}
//POPULATE SPACECRAFTS ARRAYLIST
private void populateData()
{
spacecrafts.add("Casini");
spacecrafts.add("Enterprise");
spacecrafts.add("Spitzer");
spacecrafts.add("Huygens");
spacecrafts.add("WMAP");
spacecrafts.add("Juno");
spacecrafts.add("Kepler");
spacecrafts.add("Apollo 15");
spacecrafts.add("Challenger");
spacecrafts.add("Discovery");
}
/*
SET ARRAYLIST TO SPACECRAFTS COLLECTION CLASS
*/
private SpacecraftsCollection getData()
{
SpacecraftsCollection spacecraftsCollection=new SpacecraftsCollection();
spacecraftsCollection.setSpacecrafts(spacecrafts);
return spacecraftsCollection;
}
/*
SEND DATA TO SECOND ACTIVITY
*/
private void sendData()
{
Intent i=new Intent(this,SecondActivity.class);
i.putExtra("SPACECRAFTS",this.getData());
startActivity(i);
}
}
Resultado
Esto es lo que se obtiene al ejecutar el proyecto:
Descargar
Descargue el código aquí.