2012-01-31 3 views
3

J'utilise la balise XMLAndroid: Modification de la configuration Non Mise à jour

android:configChanges="orientation|keyboardHidden|keyboard" 

et le code suivant pour détecter les changements d'orientation de l'appareil et modifier mise en page:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    disp = getWindowManager().getDefaultDisplay(); 
    swidth = disp.getWidth(); 
    sheight = disp.getHeight(); 
    parent.removeAllViews(); 
    parent = new RelativeLayout(this); 
    if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
     layoutPortrait(); 
    else 
     layoutLandscape(); 
} 

Cela fonctionne bien en cours portrait sous forme de paysage . Mais, pour une raison ou une autre, passer du paysage au portrait (en commençant par le paysage ou en passant à l'arrière puis à l'arrière) ne permet pas de revenir à l'affichage portrait. Grâce à l'utilisation des messages de journal, j'ai déterminé que, après avoir été en mode paysage, les classes Affichage et Configuration NE DOIVENT PAS ÊTRE MISES À JOUR. Ils conservent les mêmes valeurs d'orientation/longueur/largeur que lorsque l'appareil était en mode paysage.

Est-ce que quelqu'un a une idée pourquoi c'est?

Code additionnel (demandé par contributeur)

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    disp = getWindowManager().getDefaultDisplay(); 
    swidth = disp.getWidth(); 
    sheight = disp.getHeight(); 
    int ornt; 
    if(swidth == sheight) 
     ornt = Configuration.ORIENTATION_SQUARE; 
    else if(swidth < sheight) 
     ornt = Configuration.ORIENTATION_PORTRAIT; 
    else if(swidth > sheight) 
     ornt = Configuration.ORIENTATION_LANDSCAPE; 
    else 
     ornt = Configuration.ORIENTATION_UNDEFINED; 
    parent = new RelativeLayout(this); 
    labelOne = new TextView(this); 
    labelOne.setText("Temperature"); 
    labelOne.setId((int)(Math.random()*Integer.MAX_VALUE)); 
    temp = new EditText(this); 
    temp.setSingleLine(true); 
    temp.setBackgroundColor(Color.WHITE); 
    temp.setTextColor(Color.BLACK); 
    temp.setId((int)(Math.random()*Integer.MAX_VALUE)); 
    labelTwo = new TextView(this); 
    labelTwo.setText("Humidity(%)"); 
    labelTwo.setId((int)(Math.random()*Integer.MAX_VALUE)); 
    humidity = new EditText(this); 
    humidity.setSingleLine(true); 
    humidity.setBackgroundColor(Color.WHITE); 
    humidity.setTextColor(Color.BLACK); 
    humidity.setId((int)(Math.random()*Integer.MAX_VALUE)); 
    output = new TextView(this); 
    output.setBackgroundColor(Color.WHITE); 
    output.setTextColor(Color.BLACK); 
    output.setId((int)(Math.random()*Integer.MAX_VALUE)); 
    submit = new Button(this); 
    submit.setText("Calculate"); 
    submit.setId((int)(Math.random()*Integer.MAX_VALUE)); 
    submit.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
       Double result = Calculate.calculate(getInputs()); 
       if(result !=null) { 
       String answer = String.format("%,.1f",result); 
       if(f.isChecked()) { 
        output.setText(answer + "°F"); 
       } else { 
        output.setText(answer + "°C"); 
       } 
       } 
     } 
    }); 
    f = new RadioButton(this); 
    f.setText("Fahrenheit"); 
    c = new RadioButton(this); 
    c.setText("Celsius"); 
    rg = new RadioGroup(this); 
    rg.setOnCheckedChangeListener(new ListenForMode()); 
    rg.addView(f); 
    rg.addView(c); 
    rg.setId((int)(Math.random()*Integer.MAX_VALUE)); 
    f.setChecked(true); 
    if(ornt == Configuration.ORIENTATION_PORTRAIT || ornt == Configuration.ORIENTATION_SQUARE) 
     layoutPortrait(); 
    else 
     layoutLandscape(); 
} 

Mise à jour finale

d'émission est avec l'émulateur ne répond pas correctement aux changements d'orientation. J'ai changé la vérification de l'orientation onConfigurationChanged (...) pour utiliser la largeur de la condition < hauteur pour le portrait et tout le reste du paysage. Cela fonctionne parfaitement sur mon appareil Android.

Merci à tous les contributeurs à cette question!

+0

Pourquoi ne pas simplement laisser Android gérer le changement de mise en page pour vous en fournissant d'autres ressources? – bschultz

+0

Deuxièmement. De plus, votre routine layoutLandScape appelle-t-elle setRequestedOrientation, par hasard? Une fois que vous faites cela, vous cesserez d'obtenir des notifications de changements d'orientation. –

+0

@ LawrenceD'Oliveiro Non, il n'appelle pas cette méthode. Il suffit de repeindre la mise en page pour travailler avec une vue de paysage. – bgroenks

Répondre

0

Si cela se passe sur l'émulateur, alors c'est OK - l'émulateur se comporte un peu bizarre au sens des changements de configuration. J'ai essayé de résoudre le même problème, à moins que j'ai remarqué que l'application fonctionnait bien sur un appareil réel.

Il semble que l'émulateur ignore l'attribut android:configChanges="orientation", mais de façon un peu étrange: il force la modification de la configuration mais n'appelle pas la méthode onConfigurationChanged(..) chaque fois qu'il doit être appelé.

+0

Il ne fait rien sur l'émulateur. Ai-je mentionné qu'il se bloque sur le téléphone réel? – bgroenks

+0

Ok, grattez le crash. C'était un code de test qui n'avait pas été retiré ... – bgroenks

1

Vous ne devriez vraiment pas surcharger les changements de configuration dans votre manifeste. Android peut gérer le redécoupage des vues pour vous, et il le gère très bien, surtout si vous avez filtré les mises en page dans votre dossier de ressources.

Si vous annulez des changements de configuration en raison de problèmes avec AsyncTask perdant son Contexte (comme je l'ai déjà fait), je recommanderais d'utiliser un IntentService pour gérer votre travail asynchrone car les Services ne sont liés à aucune activité.

+0

Mais ne dois-je pas le remplacer si je veux qu'il utilise une autre disposition? Rappelez-vous que je le fais en code Java n'utilisant pas les ressources BMP. – bgroenks

+0

Si vous mettez votre disposition de paysage dans layout-land et gardez les noms le même Android choisira la disposition dans le layout-land – SeanPONeil

+0

Êtes-vous en train de dire que vous construisez vos mises en page en code Java et non en XML? – SeanPONeil

Questions connexes