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!
Pourquoi ne pas simplement laisser Android gérer le changement de mise en page pour vous en fournissant d'autres ressources? – bschultz
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. –
@ 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