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:

  1. Intent.
  2. Bundle
  3. 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 clase MyFragment.
  • 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 una activity.
  • Cómo paso datos entre fragment y activity usando intents.
  • Cómo realizo FragmentTransaction.
  • Anular onResume() y recibir datos en android.
  • Cómo trabajar tanto con fragment como con activity.

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, lanzador activity.
  • 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 extendemos android.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á:

Cómo pasar datos de <code>fragment</code> a <code>activity</code>

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

  1. Primero crea un nuevo proyecto en android studio. Ve a Archivo --> Nuevo Proyecto.
  2. Escribe el nombre de la aplicación y elige el nombre de la empresa.
  3. Elige el SDK mínimo.
  4. Elegir actividad vacía o básica.
  5. 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 nuestro fragment 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:

Cómo pasar datos de <code>Activity</code> a <code>Fragment</code>

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 segunda actividad.

    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:

Cómo pasar datos de ListView a ListView

Descargar

Descargue el código aquí.

Categorizado en:

Etiquetado en: