Nachdem ich einige Änderungen an meiner Datenbank vorgenommen habe, die erhebliche Änderungen an meinen Ansichten mit sich bringen, möchte ich onCreate neu zeichnen und erneut ausführen.
Wie ist das möglich?
UPDATE : Android SDK 11 hat recreate()
Aktivitäten eine Methode hinzugefügt .
Ich habe das getan, indem ich einfach die Absicht wiederverwendet habe, mit der die Aktivität gestartet wurde. Definieren Sie eine Absicht starterIntent
in Ihrer Klasse und weisen Sie sie onCreate()
mit zu starterIntent = getIntent();
. Wenn Sie die Aktivität neu starten möchten, rufen Sie anfinish(); startActivity(starterIntent);
Es ist keine sehr elegante Lösung, aber es ist eine einfache Möglichkeit, Ihre Aktivität neu zu starten und sie zu zwingen, alles neu zu laden.
finish()
sofort nach demstartActivity()
aus genau diesem Grund anzurufen ...finish();
dann zuerst erreichtstartActivity(starterIntent);
Rufen Sie die Methode zum erneuten Erstellen der Aktivität auf.
quelle
recreate()
aber jetzt sehe ich ein seltsames Problem, bei dem Optionsfelder beim Neuerstellen nicht zurückgesetzt werden, aber wennfinish(); startActivity(getIntent());
dies der Fall ist, verwende ich dies jetzt und sehe, wie es in den nächsten Tagen oder Wochen funktioniert.Wenn Sie hier einige Antworten kombinieren, können Sie Folgendes verwenden.
Testen
Ich habe es ein bisschen getestet und es gibt einige Probleme:
startActivity(...); finish();
existiert beim Aufrufen nur die App und die Aktivität wird nicht neu gestartet.super.recreate()
verhält sich nicht so, als würde man die Aktivität vollständig neu erstellen. Dies entspricht dem Drehen des Geräts. Wenn Sie alsoFragment
s haben, werdensetRetainInstance(true)
diese nicht neu erstellt. nur angehalten und wieder aufgenommen.Daher glaube ich derzeit nicht, dass es eine akzeptable Lösung gibt.
quelle
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB
anstatt zu verwenden11
startActivity(getIntent());finish();
zufinish();startActivity(getIntent());
Option 1
Rufen
recreate()
Sie anActivity
. Bei dieser Methode wird jedoch während der Neuerstellung der Aktivität ein blinkender schwarzer Bildschirm angezeigt.Option 2
Hier gibt es keinen "blinkenden" schwarzen Bildschirm, aber Sie sehen einen Übergang zwischen der alten und der neuen Instanz mit einem nicht so angenehmen schwarzen Hintergrund. Wir können es besser machen.
Option 3
Um dies zu beheben, können wir einen Aufruf hinzufügen an
overridePendingTransition()
:Auf Wiedersehen schwarzer Bildschirm, aber in meinem Fall sehe ich immer noch eine Art Übergang (eine Überblendanimation), diesmal auf einem farbigen Hintergrund. Dies liegt daran, dass Sie die aktuelle Instanz Ihrer Aktivität beenden, bevor die neue erstellt wird und vollständig sichtbar wird. Die Zwischenfarbe ist der Wert des
windowBackground
Themenattributs.Option 4
Wenn Sie
finish()
danach anrufen,startActivity()
wird der Standardübergang zwischen Aktivitäten verwendet, häufig mit einer kleinen Einschubanimation. Der Übergang ist aber noch sichtbar.Option 5
Für mich ist dies die beste Lösung, da die Aktivität ohne sichtbaren Übergang neu gestartet wird, als wäre nichts passiert.
Dies kann hilfreich sein, wenn Sie beispielsweise in Ihrer App eine Möglichkeit zum Ändern der Anzeigesprache unabhängig von der Systemsprache bereitstellen. In diesem Fall möchten Sie Ihre Aktivität wahrscheinlich immer dann ohne Übergang neu starten, wenn der Benutzer die Sprache Ihrer App ändert, damit der Sprachwechsel sofort angezeigt wird.
quelle
Wenn ich eine Aktivität neu starten muss, verwende ich folgenden Code. Obwohl es nicht empfohlen wird.
quelle
Für API vor 11 können Sie recreate () nicht verwenden. Ich habe auf diese Weise gelöst:
und in onCreate ..
quelle
Nachdem
recreate
ich nach dem Lebkuchengerät gesucht habe , möchte ich folgende Codes (für Lebkuchen) verwenden:Für diese Codes stammt es aus der Implementierung in einer höheren API.
Api-10 hat keine requestRelaunchActivity, aber aus dem Diff habe ich folgendes gefunden:
Also ich denke ich könnte
scheduleRelaunchActivity
stattdessen verwendenrequestRelaunchActivity
.Und ich habe sie mit Reflect geschrieben:
Ich verwende diese Codes für die Rückportierung von xposed Framework.
quelle
Build.VERSION_CODES.ECLAIR_MR1
(v7). Es kann auch auf älteren Versionen funktionieren.Rufen Sie die
recreate()
Methode auf, von der aus Sie Ihre Aktivität neu erstellen möchten. Diese Methode zerstört die aktuelle Instanz von Aktivität mitonDestroy()
und erstellt dann Aktivität mit neuonCreate()
.quelle
Wenn dies Ihr Problem ist, sollten Sie wahrscheinlich eine andere Methode implementieren, um die Ansicht in Ihrer Aktivität auszufüllen. Anstatt es erneut auszuführen
onCreate()
, sollten Sie es so machen, dassonCreate()
Ihre Füllmethode mit einem Argument aufgerufen wird. Wenn sich die Daten ändern, sollte die Füllmethode mit einem anderen Argument aufgerufen werden.quelle
Ich habe es so gelöst, indem ich Fragmente verwendet habe . Diese sind bis API 4 mithilfe der Support-Bibliothek abwärtskompatibel.
Sie erstellen ein "Wrapper" -Layout mit einem FrameLayout.
Beispiel:
Anschließend erstellen Sie eine FragmentActivity, in der Sie das FrameLayout jederzeit ersetzen können.
Beispiel:
In dem Fragment, das Sie aufblasen / ersetzen, können Sie onStart und onCreateView so verwenden, wie Sie normalerweise das onCreate einer Aktivität verwenden würden.
Beispiel:
quelle
Abhängig von Ihrer Situation benötigen Sie möglicherweise
getActivity().recreate();
nicht nurrecreate()
.Sie sollten es beispielsweise verwenden, wenn Sie
recreate()
in der Klasse arbeiten, die innerhalb der Aktivitätsklasse erstellt wurde.quelle
Ich habe einmal eine Test-App erstellt, die die Datenbankdatei mithilfe des Firebase-Cloud-Speichers hochlädt, löscht und dann erneut herunterlädt. Um die Daten in der Datenbank anzuzeigen, war der folgende Code die einzige Lösung, die ich gefunden habe. Weder
recreate()
nochfinish()
in diesem Fall funktioniert.quelle
Ich habe herausgefunden, wie Sie Ihr Fragment am besten aktualisieren können, wenn sich Daten ändern
Wenn Sie eine Schaltfläche "Suchen" haben, müssen Sie Ihre ARRAY-Liste innerhalb der Schaltfläche initialisieren
mSearchBtn.setOnClickListener (neuer View.OnClickListener () {
@Override public void onClick (View v) {
quelle
Wenn Sie einen Parameter an onCreate () übergeben möchten, müssen Sie eine neue Absicht mit dem Hinzufügen von extra erstellen und damit StartActivity aufrufen. Hier ist ein einfaches Beispiel, das ich auf diese Weise gemacht habe.
quelle
Wenn Sie nur versuchen, Ihre Ansicht zu wiederholen, hatte ich genau das gleiche Problem.
onResume
Versuchen Sie in der Funktion Folgendes:Das war auch in meinem
onCreate()
, also hat dasonResume
für mich funktioniert :)quelle