Il est difficile de réfléchir à ce qu'il faut faire lorsque l'activité est détruite si elle prend sérieusement en charge la rotation, mais si vous voulez gérer la rotation à peu près en dehors des détails, ViewModel C'est facile à faire avec / topic / bibliothèques / architecture / viewmodel).
Par exemple, supposons que vous ayez une activité qui affiche le nombre de rotations dans Toast à chaque fois qu'elle tourne sous la forme suivante.
public class MainActivity extends AppCompatActivity {
//Je veux conserver cette valeur même si je la fais pivoter
int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
count++;
Toast.makeText(this, String.valueOf(count) + "La deuxième fois! !!", Toast.LENGTH_SHORT).show();
}
}
Lorsque j'exécute ce code, "Première fois !!" s'affiche quel que soit le nombre de rotations. C'est parce que chaque fois qu'il est tourné, il recommence à partir de onCreate () et count est initialisé.
Si vous incluez des composants d'architecture fournis par Google, vous pouvez facilement les faire pivoter.
Faites app / build.gradle comme suit:
dependencies {
...
compile 'android.arch.lifecycle:extensions:1.1.1'
...
}
Étant donné que la bibliothèque ci-dessus se trouve uniquement dans le référentiel Google, vous devez apporter des modifications à build.gradle à la racine du projet comme suit.
allprojects {
repositories {
jcenter()
maven { url 'https://maven.google.com' }
}
}
Vous pouvez désormais utiliser les composants d'architecture. Il ne vous reste plus qu'à modifier l'activité comme suit.
public class MainActivity extends AppCompatActivity {
//Poussez la variable que vous souhaitez conserver dans le ↓ ViewModel!
public static class MyModel extends ViewModel {
int count = 0;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Extraire le modèle défini ci-dessus à partir de ViewModelProviders
//La valeur avant rotation est correctement conservée dans le modèle pris ici.
MyModel model = ViewModelProviders.of(this).get(MyModel.class);
model.count++;
Toast.makeText(this, String.valueOf(model.count) + "La deuxième fois! !!", Toast.LENGTH_SHORT).show();
}
}
Faites de la variable que vous souhaitez conserver après la rotation une variable membre appelée ViewModel et faites-la pivoter simplement en la retirant de ViewModelProvider. La correspondance est terminée. Facile!
Bien sûr, Fragment peut le gérer de la même manière.
ViewModel le publie également en fonction du cycle de vie, vous n'avez donc pas à vous soucier des fuites. Cependant, sachez que si vous placez une vue ou un contexte dans un ViewModel, il fuit.
Il convient de noter que l'activité peut être détruite lorsque l'application est en arrière-plan et laissée pendant un certain temps, mais dans ce cas, le nombre revient à la valeur initiale (0 dans ce code). Je vais finir.
Si vous souhaitez le prendre en charge correctement, vous devez prendre en charge la rotation à l'aide de saveInstanceState, Room, etc.
Recommended Posts