Dans mon application Android, quand j'ai faites pivoter l'appareil (faire glisser le clavier), puis mon activité est redémarré (onCreate est appelé). Maintenant, c'est probablement la façon dont il est censé être, mais je fais beaucoup de réglage initial dans la méthode onCreate, j'ai donc besoin de:
1. Mettre tous les réglage initial dans une autre fonction, donc c'est pas perdu sur l'appareil ou de la rotation
2. Faire en sorte onCreate n'est pas appelé de nouveau et la mise en page juste ajuste ou
3. Limiter l'application à juste portrait de sorte que onCreate n'est pas appelé.
Réponses
Trop de publicités?À l'aide de la Classe d'Application
En fonction de ce que vous faites dans votre initialisation, vous pourriez envisager la création d'une nouvelle classe qui étend la classe Application
et en déplaçant votre code d'initialisation dans un substituée onCreate
méthode dans cette classe.
public class MyApplicationClass extends Application {
@Override
public void onCreate() {
super.onCreate();
// TODO Put your application initialization code here.
}
}
L' onCreate
dans la classe d'application n'est appelée que lorsque l'ensemble de l'application est créé, l'Activité redémarre sur l'orientation du clavier ou de la visibilité changements ne se déclenche pas.
C'est une bonne pratique pour exposer l'instance de cette classe comme un singleton, et en exposant les variables d'application, vous êtes l'initialisation à l'aide de getters et setters.
REMARQUE: Vous aurez besoin de spécifier le nom de votre nouvelle classe d'Application dans le manifeste pour qu'il puisse être enregistré et utilisé.
Réagir à des Modifications de Configuration
Une autre alternative, vous pouvez avoir votre application pour écouter les événements qui pourraient entraîner un redémarrage – comme l'orientation et le clavier modifications de visibilité – et de les gérer au sein de votre Activité.
Commencez par ajouter l' android:configChanges
nœud à votre Activité manifeste du nœud
android:configChanges="keyboardHidden|orientation"
ou pour Android 3.2 (API level 13) et plus récents:
android:configChanges="keyboardHidden|orientation|screenSize"
Puis, dans l'Activité de remplacer l' onConfigurationChanged
méthode et appelez - setContentView
de la force de l'interface graphique de mise en page pour être refait dans la nouvelle orientation.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.myLayout);
}
Mise à jour pour Android 3.2 et supérieur:
Attention: Début avec Android 3.2 (API level 13), la "taille de l'écran" change également lorsque l'appareil commute entre le mode portrait et orientation paysage. Ainsi, si vous souhaitez empêcher l'exécution redémarre en raison de changement d'orientation lors de l'élaboration de l'API de niveau 13 ou supérieur (tel que déclaré par le minSdkVersion et targetSdkVersion attributs de), vous devez inclure l'
"screenSize"
de la valeur en plus de la"orientation"
de la valeur. C'est, vous devez déclarerandroid:configChanges="orientation|screenSize"
. Toutefois, si votre application cible API de niveau 12 ou moins, puis votre activité toujours les poignées de ce changement de configuration lui-même (ce changement de configuration ne redémarrez pas votre activité, même lors de l'exécution Android 3.2 ou supérieure de l'appareil).
Au lieu d'essayer d'arrêter le onCreate() d'être tiré au total, peut-être essayer de vérifier le Bundle savedInstanceState transmis dans les cas pour voir si elle est nulle ou pas.
Par exemple, si j'ai un peu de logique qui doit être exécuté lorsque l'activité est réellement créé, non pas sur chaque changement d'orientation, je n'exécuter que la logique dans le onCreate() uniquement si le savedInstanceState est null.
Sinon, je veux encore la mise en page pour redessiner correctement pour l'orientation.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState == null){
setupCloudMessaging();
}
setContentView(R.layout.activity_game_list);
}
vous ne savez pas si c'est la réponse ultime, mais cela fonctionne pour moi.
ce que j'ai fait...
dans le manifeste, à l'activité de la section, a ajouté:
android:configChanges="keyboardHidden|orientation"
dans le code de l'activité, mise en œuvre:
//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
//get views from ID's
this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);
//etc... hook up click listeners, whatever you need from the Views
}
//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InitializeUI();
}
//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
InitializeUI();
}
Ce que vous décrivez est le comportement par défaut. Vous avez pour détecter et gérer ces événements vous-même en ajoutant:
android:configChanges
pour votre manifeste, puis les modifications que vous souhaitez gérer. Donc, pour l'orientation, vous pouvez utiliser:
android:configChanges="orientation"
et pour le clavier soit ouvert ou fermé, vous devez utiliser:
android:configChanges="keyboardHidden"
Si vous souhaitez gérer à la fois, vous pouvez simplement les séparer avec le tuyau de commande de ce type:
android:configChanges="keyboardHidden|orientation"
Cela va déclencher la onConfigurationChanged méthode dans toutes les Activités que vous appelez. Si vous substituez la méthode, vous pouvez passer à les nouvelles valeurs.
Espérons que cette aide.