Dans mon application Android, lorsque je fais pivoter l'appareil (faites glisser le clavier), mon Activity
est redémarré ( onCreate
est appelé). Maintenant, c'est probablement comme ça que ça devrait être, mais je fais beaucoup de configuration initiale dans la onCreate
méthode, j'ai donc besoin soit:
- Mettez toute la configuration initiale dans une autre fonction afin que tout ne soit pas perdu lors de la rotation de l'appareil ou
- Faites en sorte qu'il
onCreate
ne soit pas appelé à nouveau et la mise en page se règle simplement ou - Limitez l'application à un simple portrait afin qu'elle
onCreate
ne soit pas appelée.
android
rotation
android-activity
Isaac Waller
la source
la source
Réponses:
Utilisation de la classe d'application
Selon ce que vous faites dans votre initialisation, vous pouvez envisager de créer une nouvelle classe qui étend
Application
et de déplacer votre code d'initialisation dans uneonCreate
méthode redéfinie au sein de cette classe.Dans
onCreate
la classe d'application est appelé uniquement lorsque l'application entière est créée, de sorte que l'activité redémarre lors de changements d'orientation ou de visibilité du clavier ne la déclenchera pas.Il est recommandé d'exposer l'instance de cette classe en tant que singleton et d'exposer les variables d'application que vous initialisez à l'aide de getters et setters.
REMARQUE: vous devrez spécifier le nom de votre nouvelle classe d'application dans le manifeste pour qu'elle soit enregistrée et utilisée:
Réagir aux changements de configuration [MISE À JOUR: ceci est obsolète depuis l'API 13; voir l'alternative recommandée ]
Comme alternative, vous pouvez demander à votre application d'écouter les événements qui provoqueraient un redémarrage - comme les changements d'orientation et de visibilité du clavier - et de les gérer dans votre activité.
Commencez par ajouter le
android:configChanges
nœud au nœud manifeste de votre activitéou pour Android 3.2 (API niveau 13) et plus récent :
Ensuite, dans l'activité, remplacez la
onConfigurationChanged
méthode et appelezsetContentView
pour forcer la disposition de l'interface graphique à refaire dans la nouvelle orientation.la source
android:configChanges
) doit être évitée et utilisée uniquement en dernier recours. Veuillez lire Gestion des modifications du runtime pour plus d'informations sur la façon de gérer correctement un redémarrage en raison d'un changement de configuration. Au lieu de cela, pour conserver les données sur les événements de rotation, ils semblent préférer utiliser leonSaveInstanceState Bundle
; ou @ Jon-O mentionne ,onRetainNonConfigurationInstance
.onRetainNonConfigurationChanges
est plus tolérante aux pannes et simple.Mise à jour pour Android 3.2 et supérieur:
la source
Fragments
et à lasetRetainInstance
place.screenSize
pour Android 3.2 et supérieur, qui a résolu mon problème, merci!Au lieu d'essayer d'empêcher
onCreate()
complètement le tir, essayez peut-être de vérifier leBundle
savedInstanceState
passage dans l'événement pour voir s'il est nul ou non.Par exemple, si j'ai une logique qui doit être exécutée lorsque le
Activity
est vraiment créé, pas à chaque changement d'orientation, je n'exécute cette logiqueonCreate()
que si lesavedInstanceState
est nul.Sinon, je veux toujours que la mise en page soit redessinée correctement pour l'orientation.
Je ne sais pas si c'est la réponse ultime, mais cela fonctionne pour moi.
la source
Intent serverintent = new Intent(MainActivity.this, MessageListener.class);
etstartService(serverintent);
créer unserverSocket = new ServerSocket(0xcff2);
etSocket client = serverSocket.accept();
avec unBufferedReader(new InputStreamReader(client.getInputStream()));
et je pouvais faire pivoter mon Android et garder la connexion client / serveur active, tout en faisant tourner l'interface graphique. Selon le manuel, saveInstanceState est initialisé lorsque la dernière activité est arrêtée.ce que j'ai fait...
dans le manifeste, à la section des activités, a ajouté:
dans le code de l'activité, implémenté:
la source
Ce que vous décrivez est le comportement par défaut. Vous devez détecter et gérer ces événements vous-même en ajoutant:
à votre manifeste, puis les modifications que vous souhaitez gérer. Donc, pour l'orientation, vous utiliseriez:
et pour que le clavier soit ouvert ou fermé, vous utiliseriez:
Si vous voulez gérer les deux, vous pouvez simplement les séparer avec la commande pipe comme:
Cela déclenchera la méthode onConfigurationChanged dans l'activité que vous appelez. Si vous remplacez la méthode, vous pouvez transmettre les nouvelles valeurs.
J'espère que cela t'aides.
la source
Je viens de découvrir cette tradition:
Pour maintenir l'activité en vie grâce à un changement d'orientation et la gérer
onConfigurationChanged
, la documentation et l'exemple de code ci-dessus le suggèrent dans le fichier manifeste:qui a l'avantage supplémentaire qu'il fonctionne toujours.
Le bonus est que l'omission de
keyboardHidden
mai peut sembler logique, mais cela provoque des échecs dans l'émulateur (pour Android 2.1 au moins): en spécifiant uniquementorientation
, l'émulateur appellera à la foisOnCreate
etonConfigurationChanged
parfois, et seulement à d'OnCreate
autres moments.Je n'ai pas vu l'échec sur un appareil, mais j'ai entendu dire que l'émulateur échouait pour d'autres. Cela vaut donc la peine d'être documenté.
la source
Fragments
et à lasetRetainInstance
place.Vous pouvez également envisager d'utiliser la méthode de la plate-forme Android pour conserver les données lors des changements d'orientation:
onRetainNonConfigurationInstance()
etgetLastNonConfigurationInstance()
.Cela vous permet de conserver les données lors des modifications de configuration, telles que les informations que vous avez pu obtenir d'un serveur ou quelque chose d'autre qui a été calculé dans
onCreate
ou depuis, tout en permettant à Android de réorganiser votreActivity
utilisation du fichier xml pour l'orientation actuellement utilisée. .Voir ici ou ici .
Il convient de noter que ces méthodes sont désormais obsolètes (bien que toujours plus flexibles que la gestion de l'orientation, changez-vous comme le suggèrent la plupart des solutions ci-dessus) avec la recommandation que tout le monde passe à
Fragments
et plutôt utilisesetRetainInstance(true)
sur chacune queFragment
vous souhaitez conserver.la source
L'approche est utile mais incomplète lors de l'utilisation de Fragments.
Les fragments sont généralement recréés lors d'un changement de configuration. Si vous ne souhaitez pas que cela se produise, utilisez
setRetainInstance(true);
dans le (s) constructeur (s) du FragmentCela entraînera la conservation des fragments lors du changement de configuration.
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
la source
setRetainInstance()
méthode @Abdo mentionnée.J'ai simplement ajouté
dans le fichier manifeste et n'a ajouté aucune
onConfigurationChanged
méthode dans mon activité.Donc, chaque fois que le clavier glisse ou rien ne se passe .
la source
<application ...android:configChanges="keyboard|keyboardHidden|orientation">
et cela fonctionne. Mes paramètres dans build.gradle:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
La
onCreate
méthode est toujours appelée même lorsque vous changezorientation
d'Android. Donc, déplacer toutes les fonctionnalités lourdes vers cette méthode ne va pas vous aiderla source
Mettez le code ci-dessous dans votre
<activity>
baliseManifest.xml
:la source
Quelle partie du manifeste dit qu'il "n'appelle pas
onCreate()
"?En outre, les documents de Google disent de ne pas utiliser
android:configChanges
(sauf en dernier recours) .... Mais les autres méthodes , ils suggèrent tous DO utilisationandroid:configChanges
.D'après mon expérience, l'émulateur fait TOUJOURS appel
onCreate()
à la rotation.Mais les 1-2 appareils sur lesquels j'exécute le même code ... ne le font pas. (Je ne sais pas pourquoi il y aurait une différence.)
la source
C'est très simple, procédez comme suit:
Cela fonctionne pour moi:
Remarque: l' orientation dépend de votre exigence
la source
Les modifications à apporter au manifeste Android sont les suivantes:
Les ajouts à faire à l'intérieur de l'activité sont:
la source
Ajoutez cette ligne à votre manifeste: -
et cet extrait de l'activité: -
la source
Il y a plusieurs moyens de le faire:
Enregistrer l'état de l'activité
Vous pouvez enregistrer l'état de l'activité dans
onSaveInstanceState
.puis utilisez le
bundle
pour restaurer l'état.Gérez vous-même les changements d'orientation
Une autre alternative consiste à gérer vous-même les changements d'orientation. Mais cela n'est pas considéré comme une bonne pratique.
Ajoutez-le à votre fichier manifeste.
pour Android 3.2 et versions ultérieures:
Restreindre la rotation
Vous pouvez également limiter votre activité en mode portrait ou paysage pour éviter la rotation.
Ajoutez ceci à la balise d'activité dans votre fichier manifeste:
Ou implémentez cela par programme dans votre activité:
la source
La façon dont je l' ai trouvé pour ce faire est d' utiliser les
onRestoreInstanceState
et lesonSaveInstanceState
événements pour sauver quelque chose dans leBundle
(même si vous ne avez pas besoin des variables enregistrées, il suffit de mettre quelque chose là - dedans de sorte que leBundle
est vide pas). Ensuite, sur laonCreate
méthode, vérifiez si leBundle
est vide, et si c'est le cas, faites l'initialisation, sinon, faites-le.la source
Même si ce n'est pas "la manière Android", j'ai obtenu de très bons résultats en gérant moi-même les changements d'orientation et en repositionnant simplement les widgets dans une vue pour prendre en compte l'orientation modifiée. C'est plus rapide que toute autre approche, car vos vues n'ont pas besoin d'être enregistrées et restaurées. Il offre également une expérience plus transparente à l'utilisateur, car les widgets repositionnés sont exactement les mêmes widgets, juste déplacés et / ou redimensionnés. Non seulement l'état du modèle, mais également l'état de la vue, peuvent être préservés de cette manière.
RelativeLayout
peut parfois être un bon choix pour une vue qui doit se réorienter de temps en temps. Vous venez de fournir un ensemble de paramètres de mise en page portrait et un ensemble de paramètres de mise en page paysagers, avec différentes règles de positionnement relatives sur chacun, pour chaque widget enfant. Ensuite, dans votreonConfigurationChanged()
méthode, vous passez l'setLayoutParams()
appel approprié à un appel sur chaque enfant. Si un contrôle enfant lui-même doit être réorienté en interne , il vous suffit d'appeler une méthode sur cet enfant pour effectuer la réorientation. Cet enfant appelle également des méthodes sur l'un de ses contrôles enfants qui nécessitent une réorientation interne, etc.la source
Chaque fois que l'écran tourne, l'activité ouverte est terminée et onCreate () est appelé à nouveau.
1 . Vous pouvez faire une chose pour enregistrer l'état de l'activité lorsque l'écran est tourné de sorte que, vous pouvez récupérer toutes les anciennes choses lorsque onCreate () de l'activité est appelée à nouveau. Référez ce lien
2. Si vous souhaitez empêcher le redémarrage de l'activité, placez simplement les lignes suivantes dans votre fichier manifest.xml.
la source
vous devez utiliser la méthode onSavedInstanceState pour stocker toute la valeur de son paramètre est a qui est bundle
et utilise
pour récupérer et définir la valeur pour afficher les objets, il gère les rotations de l'écran
la source
Remarque: je poste cette réponse si quelqu'un à l'avenir est confronté au même problème que moi. Pour moi, la ligne suivante n'a pas été suffisante:
Lorsque j'ai fait pivoter l'écran, la méthode `onConfigurationChanged (Configuration newConfig) n'a pas été appelée.
Solution: j'ai également dû ajouter "screenSize" même si le problème était lié à l'orientation. Donc, dans le fichier AndroidManifest.xml, ajoutez ceci:
Ensuite, implémentez la méthode
onConfigurationChanged(Configuration newConfig)
la source
Dans la section d'activité du
manifest
, ajoutez:la source
Ajoutez cette ligne dans le manifeste:
android:configChanges="orientation|screenSize"
la source
Les gens disent que vous devriez utiliser
Mais la meilleure et la plus professionnelle façon de gérer la rotation dans Android est d'utiliser la classe Loader. Ce n'est pas une classe célèbre (je ne sais pas pourquoi), mais c'est bien mieux que l'AsyncTask. Pour plus d'informations, vous pouvez lire les tutoriels Android trouvés dans les cours Android d'Udacity.
Bien sûr, comme autre moyen, vous pouvez stocker les valeurs ou les vues avec onSaveInstanceState et les lire avec onRestoreInstanceState. Cela dépend vraiment de vous.
la source
Après un certain temps d'essais et d'erreurs, j'ai trouvé une solution qui correspond à mes besoins dans la plupart des situations. Voici le code:
Configuration du manifeste:
Activité principale:
Et échantillon de fragment:
Peut être trouvé sur github .
la source
Utilisez l'
orientation
auditeur pour effectuer différentes tâches selon différentes orientations.la source
Mettez ce code ci-dessous dans votre
Activity
entréeAndroid Manifest
.Cela ne redémarrera pas votre activité lorsque vous changerez d'orientation.
la source
Fixez l'orientation de l'écran (paysage ou portrait) dans
AndroidManifest.xml
android:screenOrientation="portrait"
ouandroid:screenOrientation="landscape"
pour cela, votre
onResume()
méthode n'est pas appelée.la source
L'un des meilleurs composants d'Android Architechure présenté par Google répondra à toutes les exigences de ViewModel.
Cela est conçu pour stocker et gérer les données liées à l'interface utilisateur de manière tout au long du cycle de vie, ce qui permettra aux données de survivre lorsque l'écran tourne
Veuillez vous référer à ceci: https://developer.android.com/topic/libraries/architecture/viewmodel
la source
Vous pouvez utiliser l'objet ViewModel dans votre activité.
Les objets ViewModel sont automatiquement conservés lors des modifications de configuration afin que les données qu'ils contiennent soient immédiatement disponibles pour la prochaine activité ou instance de fragment. Lire la suite:
https://developer.android.com/topic/libraries/architecture/viewmodel
la source