Es ist schwierig zu überlegen, was zu tun ist, wenn die Aktivität zerstört wird, wenn Sie die Rotation ernsthaft unterstützen, aber wenn Sie die Rotation grob abgesehen von den Details behandeln möchten, ViewModel Es ist einfach mit / topic / bibliotheken / architektur / viewmodel zu tun.
Angenommen, Sie haben eine Aktivität, die die Anzahl der Umdrehungen in Toast bei jeder Umdrehung in der folgenden Form anzeigt.
public class MainActivity extends AppCompatActivity {
//Ich möchte diesen Wert behalten, auch wenn ich ihn drehe
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
count++;
Toast.makeText(this, String.valueOf(count) + "Das zweite Mal! !!", Toast.LENGTH_SHORT).show();
}
}
Wenn ich diesen Code ausführe, wird "Erstes Mal !!" angezeigt, egal wie oft er gedreht wird. Dies liegt daran, dass es jedes Mal, wenn es gedreht wird, von onCreate () neu startet und die Anzahl initialisiert wird.
Wenn Sie von Google bereitgestellte Architektur-Compoennts einschließen, können Sie diese problemlos drehen.
Machen Sie app / build.gradle wie folgt:
dependencies {
...
compile 'android.arch.lifecycle:extensions:1.1.1'
...
}
Da sich die obige Bibliothek nur im Google-Repository befindet, müssen Sie wie folgt Änderungen an build.gradle im Projektstamm vornehmen.
allprojects {
repositories {
jcenter()
maven { url 'https://maven.google.com' }
}
}
Sie können jetzt Architekturkomponenten verwenden. Jetzt müssen Sie nur noch die Aktivität wie folgt ändern.
public class MainActivity extends AppCompatActivity {
//Schieben Sie die Variable, die Sie behalten möchten, in das ↓ ViewModel!
public static class MyModel extends ViewModel {
int count = 0;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Extrahieren Sie das oben definierte Modell aus ViewModelProviders
//Der Wert vor der Drehung bleibt in dem hier herausgenommenen Modell korrekt erhalten.
MyModel model = ViewModelProviders.of(this).get(MyModel.class);
model.count++;
Toast.makeText(this, String.valueOf(model.count) + "Das zweite Mal! !!", Toast.LENGTH_SHORT).show();
}
}
Machen Sie die Variable, die Sie nach dem Drehen behalten möchten, zu einer Mitgliedsvariablen namens ViewModel und drehen Sie sie, indem Sie sie einfach aus ViewModelProvider herausziehen. Die Korrespondenz ist abgeschlossen. Einfach!
Natürlich kann Fragment genauso damit umgehen.
ViewModel gibt es auch entsprechend dem Lebenszyklus frei, sodass Sie sich keine Sorgen über Lecks machen müssen. Beachten Sie jedoch, dass beim Einfügen einer Ansicht oder eines Kontexts in ein ViewModel ein Leck auftritt.
Es ist zu beachten, dass die Aktivität möglicherweise zerstört wird, wenn sich die App im Hintergrund befindet und eine Weile stehen bleibt. In diesem Fall kehrt die Anzahl jedoch zum Anfangswert zurück (0 in diesem Code). Ich werde am Ende.
Wenn Sie es richtig unterstützen möchten, müssen Sie die Rotation mit saveInstanceState, Room usw. unterstützen.
Recommended Posts