Después de hacer algún cambio en mi base de datos, que implica un cambio significativo en mis vistas, me gustaría volver a dibujar, volver a ejecutar onCreate.
¿Cómo es eso posible?
ACTUALIZACIÓN : Android SDK 11 agregó un recreate()
método a las actividades.
Lo hice simplemente reutilizando la intención que inició la actividad. Defina una intención starterIntent
en su clase y asígnela onCreate()
usando starterIntent = getIntent();
. Luego, cuando quieras reiniciar la actividad, llamafinish(); startActivity(starterIntent);
No es una solución muy elegante, pero es una forma sencilla de reiniciar tu actividad y obligarla a recargar todo.
finish()
inmediatamente después delstartActivity()
precisamente por esa razón ...finish();
luegostartActivity(starterIntent);
Llame al método recrear de la actividad.
fuente
recreate()
pero ahora veo un problema extraño en el que los botones de radio no se restablecen cuando se vuelven a crear, pero lo hacen cuando,finish(); startActivity(getIntent());
así que lo estoy usando por ahora y veo cómo funciona en los próximos días o semanas.Combinando algunas respuestas aquí, puede usar algo como lo siguiente.
Pruebas
Lo probé un poco y hay algunos problemas:
startActivity(...); finish();
solo existe a la aplicación y no reinicia la actividad.super.recreate()
en realidad, no actúa de la misma manera que recrear totalmente la actividad. Es equivalente a rotar el dispositivo, por lo que si tiene mensajes deFragment
correosetRetainInstance(true)
electrónico, no se volverán a crear; simplemente hizo una pausa y reanudó.Así que actualmente no creo que haya una solución aceptable.
fuente
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
en lugar de usar11
startActivity(getIntent());finish();
afinish();startActivity(getIntent());
Opción 1
Llame
recreate()
a suActivity
. Sin embargo, este método hace que aparezca una pantalla negra intermitente durante la recreación de la actividad.opcion 2
Aquí no hay pantalla negra "parpadeante", pero verá una transición entre las instancias antiguas y nuevas con un fondo negro no tan agradable. Podemos hacerlo mejor.
Opción 3
Para solucionar esto, podemos agregar una llamada a
overridePendingTransition()
:Adiós pantalla negra, pero en mi caso todavía veo algún tipo de transición (una animación de desvanecimiento), esta vez sobre un fondo de color. Esto se debe a que está terminando la instancia actual de su actividad antes de que se cree la nueva y se vuelva completamente visible, y el color intermedio es el valor del
windowBackground
atributo del tema.Opción 4
Llamar
finish()
despuésstartActivity()
utilizará la transición predeterminada entre actividades, a menudo con una pequeña animación deslizante. Pero la transición aún es visible.Opcion 5
Para mí, esta es la mejor solución porque reinicia la actividad sin ninguna transición visible, como si no pasara nada.
Podría ser útil si, por ejemplo, en su aplicación expone una forma de cambiar el idioma de visualización independientemente del idioma del sistema. En este caso, siempre que el usuario cambie el idioma de su aplicación, probablemente querrá reiniciar su actividad sin transición, haciendo que el cambio de idioma parezca instantáneo.
fuente
Cuando necesito reiniciar una actividad, uso el siguiente código. Aunque no se recomienda.
fuente
para API anteriores a 11, no puede usar recreate (). Resolví de esta manera:
y en onCreate ..
fuente
Después de buscar el implemento de pan de jengibre
recreate
, me gustaría usar los siguientes códigos (para pan de jengibre):Para estos códigos, proviene de la implementación en una api superior.
Api-10 no tiene requestRelaunchActivity, sin embargo, desde el diff, encontré esto:
Entonces creo que podría usar en
scheduleRelaunchActivity
lugar derequestRelaunchActivity
.Y los he escrito usando reflect:
Estoy usando estos códigos para el back-porting de xposed framework.
fuente
Build.VERSION_CODES.ECLAIR_MR1
(v7). También puede funcionar en versiones anteriores.Llame al
recreate()
método desde donde desea recrear su actividad. Este método destruirá la instancia actual de Activity cononDestroy()
y luego crear la actividad cononCreate()
.fuente
Si este es su problema, probablemente debería implementar otra forma de completar la vista en su Actividad. En lugar de volver a ejecutarlo
onCreate()
, debe hacer queonCreate()
llame a su método de llenado con algún argumento. Cuando los datos cambian, el método de relleno debería llamarse con otro argumento.fuente
La forma en que lo resolví es usando Fragmentos . Estos son compatibles con versiones anteriores hasta API 4 mediante el uso de la biblioteca de soporte.
Realiza un diseño "contenedor" con un FrameLayout en él.
Ejemplo:
Luego, crea una FragmentActivity en la que puede reemplazar el FrameLayout en cualquier momento que desee.
Ejemplo:
En el Fragmento que infla / reemplaza, puede usar onStart y onCreateView como normalmente usaría onCreate de una actividad.
Ejemplo:
fuente
Además, dependiendo de su situación, es posible que necesite en
getActivity().recreate();
lugar de solorecreate()
.Por ejemplo, debe usarlo si lo está haciendo
recreate()
en la clase que se ha creado dentro de la clase de actividad.fuente
Una vez hice una aplicación de prueba que carga, elimina y luego vuelve a descargar el archivo de base de datos usando el almacenamiento en la nube de firebase. Para mostrar los datos en la base de datos, el siguiente código fue la única solución que encontré. Ni
recreate()
tampocofinish()
funcionó en este caso.fuente
Descubrí la mejor manera de actualizar su Fragmento cuando cambian los datos
si tiene un botón "buscar", debe inicializar su lista ARRAY dentro del botón
mSearchBtn.setOnClickListener (nuevo View.OnClickListener () {
@Override public void onClick (Ver v) {
fuente
Si desea pasar un parámetro a onCreate (), entonces debe crear una nueva intención agregando extra y llamar a StartActivity con ella. Aquí hay un ejemplo simple que hice de esta manera.
fuente
Si solo está buscando rehacer su vista, tuve exactamente el mismo problema. En la
onResume
función, intente poner esto:Esto también estaba en mi
onCreate()
, así que poner esto en elonResume
trabajo para mí :)fuente