Après avoir apporté des modifications à ma base de données, ce qui implique un changement significatif de mes vues, je voudrais redessiner, ré-exécuter onCreate.
Comment est-ce possible?
MISE À JOUR : Android SDK 11 a ajouté une recreate()
méthode aux activités.
Je l'ai fait en réutilisant simplement l'intention qui a lancé l'activité. Définissez une intention starterIntent
dans votre classe et attribuez-la en onCreate()
utilisant starterIntent = getIntent();
. Ensuite, lorsque vous souhaitez redémarrer l'activité, appelezfinish(); startActivity(starterIntent);
Ce n'est pas une solution très élégante, mais c'est un moyen simple de redémarrer votre activité et de la forcer à tout recharger.
finish()
immédiatement après lestartActivity()
pour cette raison précisément ...finish();
puisstartActivity(starterIntent);
Appelez la méthode recréer de l'activité.
la source
recreate()
mais maintenant je vois un problème étrange où les boutons radio ne sont pas réinitialisés lors de la recréation, mais ils le font quandfinish(); startActivity(getIntent());
je l'utilise pour le moment et je vois comment cela fonctionne au cours des prochains jours ou semaines.En combinant quelques réponses ici, vous pouvez utiliser quelque chose comme ce qui suit.
Essai
Je l'ai testé un peu, et il y a quelques problèmes:
startActivity(...); finish();
existe simplement et ne redémarre pas l'activité.super.recreate()
n'agit pas réellement de la même manière que recréer totalement l'activité. Il est équivalent à la rotation du dispositif , donc si vous avez desFragment
s avecsetRetainInstance(true)
elles ne seront pas recréés; simplement mis en pause et repris.Donc, actuellement, je ne pense pas qu'il existe une solution acceptable.
la source
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
au lieu d'utiliser11
startActivity(getIntent());finish();
tofinish();startActivity(getIntent());
Option 1
Appelez
recreate()
votreActivity
. Cependant, cette méthode fait apparaître un écran noir clignotant lors de la recréation de l'activité.Option 2
Pas d'écran noir "clignotant" ici, mais vous verrez une transition entre les anciennes et les nouvelles instances avec un fond noir pas si agréable. On peut faire mieux.
Option 3
Pour résoudre ce problème, nous pouvons ajouter un appel à
overridePendingTransition()
:Au revoir écran noir, mais dans mon cas je vois encore une sorte de transition (une animation de fondu), sur un fond coloré cette fois. C'est parce que vous terminez l'instance actuelle de votre activité avant que la nouvelle ne soit créée et devienne entièrement visible, et la couleur intermédiaire est la valeur de l'
windowBackground
attribut de thème.Option 4
L'appel
finish()
aprèsstartActivity()
utilisera la transition par défaut entre les activités, souvent avec une petite animation de diapositives. Mais la transition est toujours visible.Option 5
Pour moi, c'est la meilleure solution car elle redémarre l'activité sans aucune transition visible, comme si de rien n'était.
Cela peut être utile si, par exemple, dans votre application, vous exposez un moyen de changer la langue d'affichage indépendamment de la langue du système. Dans ce cas, chaque fois que l'utilisateur change la langue de votre application, vous voudrez probablement redémarrer votre activité sans transition, ce qui rend le changement de langue instantané.
la source
Lorsque j'ai besoin de redémarrer une activité, j'utilise le code suivant. Bien que ce ne soit pas recommandé.
la source
pour l'API antérieure à 11, vous ne pouvez pas utiliser receate (). J'ai résolu de cette manière:
et dans onCreate ..
la source
Après avoir recherché l'outil de pain d'épice pour
recreate
, j'aimerais utiliser les codes suivants (pour le pain d'épice):Pour ces codes, c'est de l'implémentation dans une API supérieure.
Api-10 n'a pas de requestRelaunchActivity, cependant, à partir du diff, j'ai trouvé ceci:
Je pense donc que je pourrais utiliser à la
scheduleRelaunchActivity
place derequestRelaunchActivity
.Et je les ai écrits en utilisant refléter:
J'utilise ces codes pour le back-porting du framework xposed.
la source
Build.VERSION_CODES.ECLAIR_MR1
(v7). Cela peut également fonctionner sur les anciennes versions.Appelez la
recreate()
méthode à partir de laquelle vous souhaitez recréer votre activité. Cette méthode détruira l'instance actuelle d'Activité aveconDestroy()
, puis recréera l'activité aveconCreate()
.la source
Si tel est votre problème, vous devriez probablement implémenter une autre façon de remplir la vue de votre activité. Au lieu de le relancer,
onCreate()
vous devriez faire en sorte qu'ilonCreate()
appelle votre méthode de remplissage avec un argument. Lorsque les données changent, la méthode de remplissage doit être appelée avec un autre argument.la source
La façon dont je l'ai résolu est en utilisant des fragments . Ceux-ci sont rétrocompatibles jusqu'à l'API 4 en utilisant la bibliothèque de support.
Vous créez une mise en page "wrapper" avec un FrameLayout.
Exemple:
Ensuite, vous créez un FragmentActivity dans lequel vous pouvez remplacer le FrameLayout à tout moment.
Exemple:
Dans le fragment que vous gonflez / remplacez, vous pouvez utiliser onStart et onCreateView comme vous utiliseriez normalement le onCreate d'une activité.
Exemple:
la source
En fonction de votre situation, vous devrez peut-être
getActivity().recreate();
au lieu de simplementrecreate()
.Par exemple, vous devriez l'utiliser si vous faites
recreate()
dans la classe qui a été créée à l'intérieur de la classe d'activité.la source
Une fois, j'ai créé une application de test qui télécharge, supprime, puis retélécharge le fichier de base de données à l'aide du stockage cloud Firebase. Pour afficher les données dans la base de données, le code suivant était la seule solution que j'ai trouvée. Ni
recreate()
nifinish()
travaillé dans ce cas.la source
J'ai découvert la meilleure façon d'actualiser votre fragment lorsque les données changent
si vous avez un bouton "recherche", vous devez initialiser votre liste ARRAY à l'intérieur du bouton
mSearchBtn.setOnClickListener (nouveau View.OnClickListener () {
@Override public void onClick (View v) {
la source
Si vous souhaitez passer un paramètre à onCreate (), vous devez créer un nouvel intent en ajoutant un supplément et appeler StartActivity avec. Voici un exemple simple que j'ai fait en utilisant cette façon.
la source
Si vous cherchez simplement à refaire votre vue, j'ai eu exactement le même problème. Dans la
onResume
fonction, essayez de mettre ceci:C'était aussi dans mon
onCreate()
, donc mettre cela dans leonResume
travaillé pour moi :)la source