Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 01/02/14, 07:41:57
Array

[xs_avatar]
Deja_vu Deja_vu no está en línea
Miembro del foro
 
Fecha de registro: abr 2012
Localización: La Plata, Argetnina
Mensajes: 364
Modelo de smartphone: Galaxy Nexus
Tu operador: Movistar
No perder datos del fragment al girar

Bueno basicamente mi duda es la que esta descripta en el titulo del tema.

Tengo un navigation drawer y al girar la pantalla pierdo los datos del fragment actual.. cual seria la mejor forma de poder guardar esos datos y recuperarlos despues? porque con las activitys estan los metodos onRestore y OnSave.. pero en los fragment estos metodos no estan.

Saludos
__________________
Responder Con Cita


  #2  
Viejo 01/02/14, 10:43:25
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Lo que tienes que hacer en la Activity es almacenar el Fragment y luego recuperarlo. El Fragment no se destruye por girar la Activity, sigue estando en el FragmentManager.
Responder Con Cita
  #3  
Viejo 01/02/14, 11:03:58
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
Para lo que dice kriogeN, tienes que hacer add o replace poniendo un tag y luego usar fragmentManager.findFragmentByTag(tag) (o algo similar), lo cual te dará el fragment anterior.

Un saludo.
Responder Con Cita
  #4  
Viejo 01/02/14, 11:48:16
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Lo que dice Arasthel funciona en la mayoría de los casos, pero si la Activity se ha destruido es probable que cuando vayas a buscar el Fragment no lo encuentres, si cuando se vuelva a crear la Activity quieres estar 100% seguro de que lo vas a encontrar tienes que almacenarlo en el Bundle, igual que cualquier otro objeto de la Activity que quieras almacenar, sólo que se hace de una forma especial, lo que yo hago es lo siguiente:

En el onSaveInstanceState hago esto:

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, "crearplanfragment", fragment);
}

Y en el onCreate hago esto:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

...................

fragment = new CrearPlanFragment();

if (savedInstanceState==null)
fragment = new CrearPlanFragment();
else
fragment = (CrearPlanFragment) getSupportFragmentManager().getFragment(savedInsta nceState, "crearplanfragment");

.............
}

Por cierto que yo nunca uso el onRestoreInstanceState, prefiero comparar si el savedInstanceState del onCreate es NULL.
Responder Con Cita
Los siguientes 3 usuarios han agradecido a kriogeN su comentario:
[ Mostrar/Ocultar listado de agradecimientos ]
  #5  
Viejo 01/02/14, 12:30:26
Array

[xs_avatar]
Arasthel Arasthel no está en línea
Cocinero veterano
· Votos compra/venta: (1)
 
Fecha de registro: jun 2009
Localización: Almería
Mensajes: 1,946
Modelo de smartphone: Nexus 5
Tu operador: Amena
No sabía que se podía poner el fragment en el Bundle . Cada día se aprende algo nuevo, ¡gracias, kriogeN!
Responder Con Cita
  #6  
Viejo 01/02/14, 17:22:11
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por Arasthel Ver Mensaje
No sabía que se podía poner el fragment en el Bundle . Cada día se aprende algo nuevo, ¡gracias, kriogeN!
De nada, yo lo descubrí a base de FCs continuos debido a los Fragment al recuperar una Activity. Desde entonces lo pongo en todas las Activities en las que uso Fragments y sin problemas.
Responder Con Cita
  #7  
Viejo 09/07/15, 09:49:42
Array

[xs_avatar]
Jaime T. Jaime T. no está en línea
Miembro del foro
 
Fecha de registro: ago 2014
Localización: colombia
Mensajes: 167
Modelo de smartphone: Motorola Moto G XT1040
Tu operador: Movistar
 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Lo que dice Arasthel funciona en la mayoría de los casos, pero si la Activity se ha destruido es probable que cuando vayas a buscar el Fragment no lo encuentres, si cuando se vuelva a crear la Activity quieres estar 100% seguro de que lo vas a encontrar tienes que almacenarlo en el Bundle, igual que cualquier otro objeto de la Activity que quieras almacenar, sólo que se hace de una forma especial, lo que yo hago es lo siguiente:

En el onSaveInstanceState hago esto:

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, "crearplanfragment", fragment);
}

Y en el onCreate hago esto:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

...................

fragment = new CrearPlanFragment();

if (savedInstanceState==null)
fragment = new CrearPlanFragment();
else
fragment = (CrearPlanFragment) getSupportFragmentManager().getFragment(savedInsta nceState, "crearplanfragment");

.............
}

Por cierto que yo nunca uso el onRestoreInstanceState, prefiero comparar si el savedInstanceState del onCreate es NULL.
amigo, este contenido va dentro del activity principal o la clase fragment, por q lo pongo en mi activity y me da errores con los fragments.
Responder Con Cita
  #8  
Viejo 09/07/15, 11:36:12
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por Jaime T. Ver Mensaje
amigo, este contenido va dentro del activity principal o la clase fragment, por q lo pongo en mi activity y me da errores con los fragments.
Va dentro de la Activity, que es la que estás recuperando y por tanto la que quieres obtener el Fragment anterior.

¿Estás usando la clase Fragment del paquete de soporte (android.support.v4.fragment o subclases), o la del API 11 (android.app.Fragment)?

Si usas la primera el código te valdrá, si usas la segunda tendrás que usar getFragmentManager en lugar de getSupportFragmentManager.

Y si no es eso, te esta fallando por otra cosa, tendrás que tracear el error.
Responder Con Cita
Gracias de parte de:
  #9  
Viejo 09/07/15, 11:40:57
Array

[xs_avatar]
Jaime T. Jaime T. no está en línea
Miembro del foro
 
Fecha de registro: ago 2014
Localización: colombia
Mensajes: 167
Modelo de smartphone: Motorola Moto G XT1040
Tu operador: Movistar
 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Va dentro de la Activity, que es la que estás recuperando y por tanto la que quieres obtener el Fragment anterior.

¿Estás usando la clase Fragment del paquete de soporte (android.support.v4.fragment o subclases), o la del API 11 (android.app.Fragment)?

Si usas la primera el código te valdrá, si usas la segunda tendrás que usar getFragmentManager en lugar de getSupportFragmentManager.

Y si no es eso, te esta fallando por otra cosa, tendrás que tracear el error.
Creo q mi problema es q no identifico quien es fragmen y quien crearplanfragmen, esos son los q me ponen error...

Enviado desde mi XT1040 mediante Tapatalk
Responder Con Cita
  #10  
Viejo 09/07/15, 13:18:20
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por Jaime T. Ver Mensaje
Creo q mi problema es q no identifico quien es fragmen y quien crearplanfragmen, esos son los q me ponen error...

Enviado desde mi XT1040 mediante Tapatalk
CrearPlanFragment es un ejemplo, así es como se llama el fragment del que he cogido el ejemplo. Tienes que sustituirlo por TU fragment.
Responder Con Cita
Gracias de parte de:
  #11  
Viejo 02/12/15, 10:33:05
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Lo que dice Arasthel funciona en la mayoría de los casos, pero si la Activity se ha destruido es probable que cuando vayas a buscar el Fragment no lo encuentres, si cuando se vuelva a crear la Activity quieres estar 100% seguro de que lo vas a encontrar tienes que almacenarlo en el Bundle, igual que cualquier otro objeto de la Activity que quieras almacenar, sólo que se hace de una forma especial, lo que yo hago es lo siguiente:

En el onSaveInstanceState hago esto:

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, "crearplanfragment", fragment);
}

Y en el onCreate hago esto:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

...................

fragment = new CrearPlanFragment();

if (savedInstanceState==null)
fragment = new CrearPlanFragment();
else
fragment = (CrearPlanFragment) getSupportFragmentManager().getFragment(savedInsta nceState, "crearplanfragment");

.............
}

Por cierto que yo nunca uso el onRestoreInstanceState, prefiero comparar si el savedInstanceState del onCreate es NULL.
Buenas, voy a recuperar este hilo ya que me estoy ayudando de el, y me sucenden cosas estrañas o no se aplicarlo bien.

Mi problema es que tengo diferentes fragments que cargo con el drawermenu, pero a la hora de salvarlo como comentas me da force close, ¿solo puedo salvar un fragment? y en ese caso com se que fragment tendría guardado a la hora de recuperarlo para hacer el cast al tipo de mi fragment?

Por otro lado, ¿que manera es mejor de manejar los fragment ?
Es mejor hacer un new mifragment() cada vez que pulso la opción del menu, o inicializar todos los fragment al empezar la actividad y luego ir reemplazandolos.

haciendo un new cada vez que pulso pierdo suavidad en la aplicación cuando pulso de nuevo el mismo menu, y con la segunda opción aveces pierdo datos
__________________

Última edición por Dild0 Día 02/12/15 a las 10:37:37.
Responder Con Cita
  #12  
Viejo 02/12/15, 10:58:15
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por Dild0 Ver Mensaje
Buenas, voy a recuperar este hilo ya que me estoy ayudando de el, y me sucenden cosas estrañas o no se aplicarlo bien.

Mi problema es que tengo diferentes fragments que cargo con el drawermenu, pero a la hora de salvarlo como comentas me da force close, ¿solo puedo salvar un fragment? y en ese caso com se que fragment tendría guardado a la hora de recuperarlo para hacer el cast al tipo de mi fragment?

Por otro lado, ¿que manera es mejor de manejar los fragment ?
Es mejor hacer un new mifragment() cada vez que pulso la opción del menu, o inicializar todos los fragment al empezar la actividad y luego ir reemplazandolos.

haciendo un new cada vez que pulso pierdo suavidad en la aplicación cuando pulso de nuevo el mismo menu, y con la segunda opción aveces pierdo datos
Si quieres recuperar los datos del Fragment la última vez que visitaste el menú, obviamente debes crearlos todos al principio y luego ir reemplazándolos. Si haces new cada vez siempre estarán vacíos y no tendrán savedInstanceState.

Ahora bien, lo que te ocurre de que algunas veces el Fragment está vacío es porque por falta de memoria se ha destruido su estado y se ha vuelto a crear.

Para solucionar este problema debes usar el onSavedInstanceState DEL FRAGMENT!!!, y recuperarlo en el onCreateView, también del Fragment.

En un principio el código de la Activity no lo necesitas, salvo que también quieras que los datos prevalezcan si la Activity se destruye, es decir, sales de ella y vuelves al rato.
Responder Con Cita
  #13  
Viejo 02/12/15, 11:37:21
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

 Cita: Originalmente Escrito por kriogeN Ver Mensaje
Si quieres recuperar los datos del Fragment la última vez que visitaste el menú, obviamente debes crearlos todos al principio y luego ir reemplazándolos. Si haces new cada vez siempre estarán vacíos y no tendrán savedInstanceState.

Ahora bien, lo que te ocurre de que algunas veces el Fragment está vacío es porque por falta de memoria se ha destruido su estado y se ha vuelto a crear.

Para solucionar este problema debes usar el onSavedInstanceState DEL FRAGMENT!!!, y recuperarlo en el onCreateView, también del Fragment.

En un principio el código de la Activity no lo necesitas, salvo que también quieras que los datos prevalezcan si la Activity se destruye, es decir, sales de ella y vuelves al rato.
Pruebo esta tarde y te comento mis nevas dudas gracias


Por cierto estoy pensando, ¿que salvas el fragment entero como en el activity o tengo que salvar dato a dato de mi fragment?
__________________

Última edición por Dild0 Día 02/12/15 a las 11:43:41.
Responder Con Cita
  #14  
Viejo 02/12/15, 13:44:40
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
 Cita: Originalmente Escrito por Dild0 Ver Mensaje
Pruebo esta tarde y te comento mis nevas dudas gracias


Por cierto estoy pensando, ¿que salvas el fragment entero como en el activity o tengo que salvar dato a dato de mi fragment?
Tienes que salvar dato a dato del fragment, en la Activity sería igual si usases el onSavedInstanceState de la Activity.
Responder Con Cita
Gracias de parte de:
  #15  
Viejo 03/12/15, 20:18:12
Array

[xs_avatar]
Dild0 Dild0 no está en línea
Usuario muy activo
 
Fecha de registro: may 2009
Mensajes: 860
Tu operador: Pepephone

@kriogeN

Ha funcionado muy bien pero tengo otro null pointer, mi fragment tiene un asyntask lo ejecuto bastantes veces y al girar la pantalla y el activity morir como se estaba ejecutando ese hilo al preguntar por getactivity() en el post execute salta el error.

Estoy tratando de hacer asyncTask.cancel(true); en el onpause del fragment pero no hace nada o si porque aveces si me cancela(tengo un mensaje) y no rompe

Es como si justo muriese el activity mientras se esta ya ejecutando el postexecute

 Cita:
Fragment MyFragmentInfo{a3dc9e} not attached to Activity
at android.support.v4.app.Fragment.getResources(Fragm ent.java:639)
at com.r.raul.down.MainDeviceInfo$5.onPostExecute(MyF ragmentInfo.java:442)

EDITO: creo que lo arregle preguntando que solo acceda en el postexecute llamando a:
 Cita:
if (!asyncTask.isCancelled())
No obstante no sé si es la forma mas optima.

saludos
__________________

Última edición por Dild0 Día 03/12/15 a las 20:30:10.
Responder Con Cita
  #16  
Viejo 03/12/15, 22:50:21
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
Yo siempre que puede haber un hilo (ya sea un AsyncTask, un Listener o lo que sea) que quiera acceder al getActivity del Fragment consulto si getActivity es != null antes de ejecutarlo.

Hasta ahora ningún problema. Pero si tienes un proceso que ejecuta un hilo en bucle haces bien en cancelarlo y no dejar que sea el sistema el que lo haga por ti.
Responder Con Cita
Gracias de parte de:
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 00:17:31 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /