Intent – Pasar datos entre Activities – App Android (Video)
En este tutorial se va a mostrar el IDE de eclipse para realizar una App en Android y como pasar datos de un activity a otro tras un evento o dicho de otra forma, como pasar datos de una pantalla a otra tras pulsar un botón. Pare realizar este tutorial se necesitará tener y saber lo siguiente:
- Se ha de tener instalado el IDE "Eclipse" y tenerlo vinculado con el SDK de Android. Para los que no tengáis hecho esto lo podeis hacer siguiendo el siguiente tutorial:(Instalar el SDK de Android y vincularlo con Eclipse)
- Se ha de tener el Eclipse configurado correctamente. En este caso solo se necesitara tener configurado el emulador del móvil aunque también es conveniente tener configurada la consola de salida de datos llamada "LogCat" para poder realizar trazas en el desarrollo de la App. Para los que no tengáis configurado el Eclipse, podeis ver como se hace en el siguiente tutorial:(Preparar las herramientas necesarias para programar en Android)
- Por último, aunque no es necesario pero si recomendable, debéis de mirar el siguiente tutorial (Activity – entender y usar una Actividad) para entender el ciclo de vida de un activity. No es necesario que lo mireis para realizar este tutorial y quizas si sois "nóveles" en el desarrollo de Apps os cueste entenderlo a la primera , pero si que es muy recomendable para que posteriormente entendáis muchas cosas en el desarrollo de Apps.
Es objectivo de este tutorial (a parte de mostrar el IDE y los archivos que hay en un proyecto) se pretende hacer la siguiente app, que consiste en recoger unos datos del primer activity y mostrarlos en el segundo, tal y como se muestra en la siguiente imagen:
Una vez vista la funcionalidad que ha de tener esta app, mostramos el video de como realizar esta App desde Cero:
El proyecto realizado en este Video-Tutorial, lo podeis descargar pulsando AQUI.
Como se ha visto en este tutorial (A parte de crear las interfaces que lleva bastante tiempo), la clave para pasar los datos de un activity a otro, es crearse un "Intent" para pasar los datos de un activity a otro. Este Intent se ha declarado dentro del código que define el evento que se ha de realizar tras pulsar el botón; es decir en el "OnClickListener". La parte del código donde se describe esta acción y se declara el Intent es el siguiente:
miBoton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent (PrimerActivity.this, SegundoActivity.class); i.putExtra("nombre", campoNombre.getText()+""); i.putExtra("apellido", campoApellidos.getText()+""); startActivity(i); } });
Como se observa, en el intent "se declaran" dos "variable", 'nombre' y 'apellido' (lo pongo entre comillas dobles porque en realidad no es así, pero lo digo de esta forma para que se entienda) que se pasan al segundo activity (Intent i = new Intent (PrimerActivity.this, SegundoActivity.class)) tras ejecutarse el método "startActivity(i)".
Cuando el "Intent" 'i' llega al segundo activity, hay que asignar los datos que hay en el activity a alguna variable o elemento del segundo activity. Es recomendable, aunque no necesario que se asigne lo que se obtiene de un Intent a variables para que sea el código mas "legible y entendible". Recogemos los datos en el segundo activity de la siguiente forma:
String nombre = getIntent().getStringExtra("nombre"); String apellidos = getIntent().getStringExtra("apellido");
Después de recoger los datos los mostramos en la pantalla en los TextView correspondientes.
Esto ha sido todo, esperamos que este tutorial os sirva de ayuda 😉
que tal si yo quiero que si yo no le mando nada me muestre el ultimo valor que le envie
Puedes guardar en alguna memoria intermedia el último valor que le enviaste para mostrarlo si detectas que no le envías nada en el Intent.
Saludos estoy llevando el curso de android y se me pidio hacer una explicacion de 3 que son: Definición comportamiento de Actividades,
Transferencia de datos entre actividades , Registro de Actividades.Si me pudieran pasar una pagina para poder estudiar y practicar pls.Gracias.
Tienes bastante información en nuestro libro gratuito de Android en https://jarroba.com/libro-android-100-gratis/
Buenas noches a todos le comento lo siguiente: estoy realizando una app y lo que quiero es que al momento de seleccionar una opción de mi spinner me cambie a otro activity pero no lo quiere hacer como que se cicla ya que lo estoy haciendo con if le dejo el código espero me puedan apoyar
sp_calculo_cementacion = (Spinner) findViewById(R.id.sp_calculo_cementacion);
sp_calculo_cementacion.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView adapterView, View view, int i, long l) {
int texto;
String selec = (String) (sp_calculo_cementacion.getSelectedItem().toString());
if (selec.equals(«20 pg»)) {
intent = new Intent(Formula3_calculo_cementacion.this, Formula3_calculo_cementacion.class);
startActivity(intent);
}
if (selec.equals(«13.375 pg»)) {
intent = new Intent(Formula3_calculo_cementacion.this, Tr13_calculo_cementacion.class);
startActivity(intent);
}
}
@Override
public void onNothingSelected(AdapterView adapterView) {
}
});
}
Tienes un ejemplo parecido a lo que necesitas en nuestro libro gratuito de Android en https://jarroba.com/libro-android-100-gratis/
Buenas. Estoy creando mi primera app y soy nuevo en el campo de la programación aunque estoy cerca de terminarla. el tema es así, en la primer activity tengo varios botones que quiero que cada uno abra una URL distinta pero en la segunda activity que es donde tengo el webview. El problema es que no se como hacerlo, osea no se como formular el Intent» para mandar la dirección y que lo cargue el webview de la segunda actividad. Agradecería su ayuda
Hola Javier. Principalmente tienes que pasar la url (una variable string) a la segunda Activity y trabajar con ella. Tienes muchos más ejemplos de Intent en nuestro libro gratuito de Android en https://jarroba.com/libro-android-100-gratis/
Como estan,
Estoy intentando pasar datos de una activity a un service, quiero que el service se quede con la información que le pase pero cuando cierro la aplicación me da un error
¿Qué error te sale?
Hola que tal felicitaciones por el tuto…. una pregunta si deseo enviar informacion masiva y deeseo trabajar en la actividad pero no quiero que cada vez que envio la info a la actividad se inicie de nuevo por que la app se esta cerrando. que podria realizar… te agradezco men..
Si la mandas por Internet no se va a iniciar la Activity, salvo por otras circunstancias o así lo tengas en el código. Si quieres enviar la información por Intent u otros medios a otras clases aquí tienes más información en nuestro libro gratuito de Android en http://jarroba.com/libro-android-100-gratis/
Buen dia Ramon:
Muchas gracias por tus aportes, tengo una duda con respecto a pasar informacion se una activity a otra, pero tengo una Activity que es una ListView en esta se muestran datos que obtengo de una Bace de datos remota. Al dar click en un Item este te manda a una nueva Activity y es aqui donde requiero pintar datos especificos de lo seleccionado estos datos ya los obtuve en la activity anterior, Te agradeceria si me das una idea de como puedo mandar esa info a la nueva Activity.
Saludos desde México.
Justo tienes un ejemplo completo de pasar datos entre Activities en nuestro libro gratuito en: http://jarroba.com/libro-android-100-gratis/
Pues yo probando el ejercicio, me sale la primera pantalla, pero al darle al botón, para pasar el string de un activty a otro me da error y me sale de la pantalla. El error que me da es:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at com.example.skirlappa.comunicacionactividades.validarNombre.onCreate(validarNombre.java:24)
public class validarNombre extends Activity
{
private TextView pasarNombre;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.verificar);
pasarNombre = (TextView) findViewById(R.id.validar);
String nombre = getIntent().getStringExtra("nombre");
pasarNombre.setText(nombre);
}
}
La variable «pasarNombre» tiene un null y es lo que te está dando error. Comprueba que el findViewById() encuenra y tiene acceso correctamente a R.java (que esté bien autogenerado) y que ese id existe en la view R.layout.verificar.
Excelente Aporte amigo! (Y)
Hola, hay manera de apoyarte mediante paypal o algo? me sirvió bastante, increíble que lo que me falta sólo era una línea de código, uso Android Studio.
Hola David, agradecemos cualquier apoyo, en estos momentos no tenemos plataforma de pago para apoyar a la web. De momento la mejor manera de apoyar es, pudiendo ayudar a quién lo necesite a que tenga la posibilidad de conocer estos artículos 🙂
Muchos ánimos!
hola soy nueva en esto estoy haciendo un login en android estudio y estoy consumiendo los recursos desde un webservice, ya visualizo la informacion desde mi movil pero lo que quiero es que si se cumple la condicion que me paresca una segunda actividad cargando los datos del usuario podria aydarme 🙂
Hola Gaby, tienes ejemplos de como pasar de una Activity a otra en http://jarroba.com/activity-entender-y-usar-una-actividad/ y mucho más en nuestro libro de Android gratuito en http://jarroba.com/libro-android-100-gratis/
Hola buenas tardes.
Tengo un problema espero puedan ayudarme..
Estoy realizando una aplicación de un juego en Android Studio, lo que hace es lo siguiente….
Abre la aplicacion y estan las opciones de jugar y salir, en el Action bar tengo una opción llamada "opciones" donde el jugador puede elegir si desea musica o no en el juego, si decide que si, mando el valor a la ventana principal por medio del put.Extra(), para de ahí mandarla a la ventana del juego si el jugador elige la opción de jugar. Hasta esa parte voy bien, el problema es que si no elijo si deseo musica o no y me voy directamente a la opción jugar, la aplicación se detiene, ya que no recibe valor de la ventana donde tengo que elegir si deseo música o no.
¿Alguién puede ayudarme en como validar esa parte?
Se los agradeceré mucho, que tengan muy buena tarde.
Comprueba que el valor no sea null cuando lo vayas a utilizar. También puedes utilizar el valor por defecto cuando recoges el dato, por ejemplo:
Long valor = intent.getLongExtra(«clave», -1)
Mira, este es el código que tengo en la ventana donde elige si desea música o no:
public void aceptarPref(View v){
if(rbSi.isChecked()){
seleccion = 1;
}
Intent i = new Intent(this, MainActivity.class);
i.putExtra("musica",seleccion);
startActivity(i);
finish();
}
Y aquí es donde recibo el valor de la ventana anterior para mandarla al juego:
Bundle bundle = getIntent().getExtras();
musica = bundle.getInt("musica");
Intent i = new Intent(this, Registro.class);
i.putExtra("music", musica);
startActivity(i);
finish();
Realice como me dijiste, y ya puedo entrar aunque no elija si quiero música o no, ahora el problema es que si elijo que si quiero música no la reproduce.
¿Que puedo hacer ahí?
Tienes que mirar si estás recibiendo correctamente el dato entre Intents. Luego ya es comprobar si estás ejecutando correctamente, echa un vistazo a http://developer.android.com/intl/es/guide/topics/media/mediaplayer.html
Buen día, amigos no se si me puedan ayudar, estoy haciendo un arraylist en el main con 5 datos, a traves del navigation bar voy a otra actividad donde agrego otro elemento a este arraylist en el main, pero cuando quiero agregar mas elemento se reescribe el ultimo que anexo…. Si alguien sabe que puedo hacer quedo agradecido.
Con este envio el dato a la actividad donde se encuentra el arraylist:
if (id == R.id.action_ok) {
editText = (EditText) findViewById(R.id.txt_descripcion);
valor = editText.getText().toString();
Intent i = new Intent(DetailTaskActivity.this, MainActivity.class);
i.putExtra(«tarea», valor + «»);
startActivity(i);
}
y con este lo recibo y lo agrego a mi arraylist:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listview);
List data = new ArrayList();
data.add(«Android»);
data.add(«iPhone»);
data.add(«WindowsMobile»);
data.add(«Blackberry»);
data.add(«WebOS»);
ArrayAdapter adapter = new ArrayAdapter(
MainActivity.this, android.R.layout.simple_list_item_1, data);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(this);
if (getIntent().getStringExtra(«tarea») != null) {
String valor = getIntent().getStringExtra(«tarea»);
data.add(valor);
}
}
Veo bien el código. Tienes el ArrayList y añades correctamente los elementos ¿Has probado a recorrerlo y a imprimirlo en el logcat? se me ocurre lo que te puse en el otro mensaje, que no se guarde el estado y vuelva a empezar.
Buena tarde Ramon pasa deq estoy creando un proyecto en android y necesito su asesoria :
Pasa deq tengo un .Xml en el cual contiene como cabecera un EditText, Dos botones para salir, y eliminar y un List View.
Como puedo agregar informacion que contiene el edittext y agregarlo al list view y una vez agregado ala lista poder tener presionado el item y poder eliminarlo con un menu emergente?
Para todo eso necesitas echar mano del Adapter (tienes un ejemplo completo en http://jarroba.com/listview-o-listado-en-android/). El resto es un poco largo de explicar por aquí, pero básicamente se basa en el Adapter eliminar y crear elementos, para llamar al notifyDataSetChanged() del Adapter para refrescar los cambios.
Hola Andrés,
Te recomiendo que uses un objeto Singleton o que lo pases como objeto serializado en un Intent.
mira una pregunta soy nuevo en esto, como hago para que a la hora de dar click a un boton me mande a otro panel???
Hola Andy,
eso lo tenemos explicado en varios sitios (tienes un ejemplo en http://jarroba.com/activity-entender-y-usar-una-actividad/). Si estás empezando con Android, tienes un curso introductorio de Android gratuito en nuestro libro gratuito de Android en: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
Tengo un problema al momento de querer abrir la otra actividad se cierra…ya verifique el AndroidManifest.xml
bueno me he dado cuenta que se cierra porque al momento de ejecutar un if que le puse este no encuentra datos …en otras palabras no esta pasando los datos de la primera actividad…muchas gracias de ante mano
Hola Jesús,
asegúrate que estás recogiendo los datos por la parte del código por la que pasa seguro (si lo cierras con un if puede que no pase nunca por ahí o solo en ciertos casos).
Me gusto su explicación y realice su ejemplo, pero tengo un problema!. No me muestra la segunda ventana, y cuando pulso el boton para pasar a la otra actividad me sale un mensaje que dice «Unfortunately, practica3 has stopped», y se cierra mi aplicacion.
quisiera que me digan por que es esto. he buscado en internet un codigo parecido y me sale lo mismo.
Hola Mario,
¿Has declarado el otro Activity en el AndroidManifest.xml? (puedes ver como en http://jarroba.com/activity-entender-y-usar-una-actividad/)
Felicidades, aun despues de dos años , este ejemplo me ayudo bastante, sigue adelante y espero sigas en esto saludos…
Buenas tardes Ramon, nuevamente agradeciendo por los Post que dedicas, que son muy intuitivos, y para nada aburridos. me gustaria saber, si dentro de tus apuntes, tendras ejemplos de como consumir un webservice, me gustaria tener la opinion de un experto como tu, Gracias de ante mano.
saludos… desde Monterrey Mexico
De nada Mike, seguiremos mejorando 🙂
Sobre tu pregunta, para Android recomiendo (y Android recomienda) utilizar siempre JSON, te recomiendo que eches un vistazo al ejemplo de http://developer.android.com/reference/android/util/JsonReader.html. Puedes utilizar utilizar otros formatos coomo XML que también son válidos. SOAP no está soportado directamente por las bibliotecas de Android (y no se recomienda por la lentitud para procesarse y que consume innecesariamente más Internet que los otros propuestos); de cualquier manera, si lo tuvieras que usar, puedes utilizar la librería externa KSOAP (en https://code.google.com/p/ksoap2-android/)
Buenas tardes Ramon. primeramente quiero darte las gracias, todos tus post me han servido de mucho, sin embargo tengo una duda, como puedo pasar un objeto a otra activity?
Hola Mike,
me alegro que te hayan servido los artículos, nos dice mucho para seguir mejorando 🙂
Sobre pasar un objeto entre Activites tienes varias maneras. Uno serializando el objeto (el objeto que quieras pasar que implemente de «Serializable») como por ejemplo:
public class MiClaseSerializable implements Serializable {
// Contenido de la clase a pasar entre Activities
}
Para pasarlo a la otra Activity simplemente lo añadimos como extra:
MiClaseSerializable objetoSerializado = new MiClaseSerializable();
..
miintent.putExtra("miObjetoSerializado", objetoSerializado);
Y lo obtienes en el otro Activity con:
MiClaseSerializable objetoRecuperado = getIntent().getSerializableExtra("miObjetoSerializado");
Otra manera de pasar objetos entre Activities es con el patrón Singleton (explicación y ejemplo en Java en: http://es.wikipedia.org/wiki/Singleton)
muchas gracias, con «implements Serializable», funciono a la perfeccion
BUEN APORTE
Seria buena idea si creo un servicio donde guardaria data; por ejemplo una especie de flag, la activity consumiria cada cierto tiempo o talvez con un listener ? asi si el flag es 0 me desactiva los botones o los activa si el flag es 1 ? es posible inplementar esta idea ? tendrias algun ejemplo de como pasar datos de un servicio a una activity y un ejemplo de listener para servicios ? gracias de antemano
Hola amigos,
de nuevo por aqui, estoy haciendo pruebas para pasar datos entre «activities», para enviar uso esto :
public void sendInvitation(View view){
Intent i = new Intent(this, MainActivity2.class);
i.putExtra(«game», Integer.toString(flag));
startActivity(i);
}
y para recibir, escribo esto en el onCreate :
final int play2 = Integer.valueOf(getIntent().getStringExtra(«game»));
tvw01.setText(«Flag : » + Integer.toString(play2));
mi duda es, siempre debo recibir los datos en el oncreate ? los valores siempre deben pasar como string ? puedo pasarlos como int ? como haria para que la variable recibida este disponible tambien para otros view, botones que se encuentren fuera del onCreate ? u otras clases externas de forma eficiente ?
Gracias de antemano
Buenas alek,
no hace falta recibir todos los datos en el oncreate (el oncreate actúa como constructor, por lo que es bueno que los reciba para construir la Actividad, pero solo para los datos iniciales).
Existe otras maneras de pasar datos entre actividades como los Shared Preferences, las bases de datos SQLite, etc para datos primitivos (String, int, boolean, etc). Te recomiendo que eches un vistazo en http://developer.android.com/guide/topics/data/data-storage.html . En caso de mucha necesidad, como pasar objetos enteros, también puedes usar la clase singleton.