J'ai essayé getOrientation()
pour obtenir la valeur d'orientation mais elle renvoie toujours 0!
getOrientation () est obsolète mais ce n'est pas nécessairement la racine de votre problème. Il est vrai que vous devez utiliser getRotation () au lieu de getOrientation () mais vous ne pouvez l'utiliser que si vous ciblez Android 2.2 (API niveau 8) ou plus. Certaines personnes et même les Googleurs semblent parfois l'oublier.
Par exemple, sur mon HTC désir exécutant Android 2.2. getOrientation () et getRotation () les deux rapportent les mêmes valeurs:
Il ne rend pas compte quand on le met "sur sa tête" (rotation 180, ce serait la valeur 2). Ce résultat est peut-être spécifique à l'appareil.
Tout d'abord, vous devez indiquer clairement si vous utilisez un émulateur ou un appareil. Savez-vous comment faire tourner l'émulateur? Ensuite, je recommanderais de créer un petit programme de test avec une méthode onCreate () comme celle-ci:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
Display mDisplay = mWindowManager.getDefaultDisplay();
Log.d("ORIENTATION_TEST", "getOrientation(): " + mDisplay.getOrientation());
}
Vérifiez si l'écran de votre appareil a été verrouillé dans les paramètres de l'appareil Paramètres> Affichage> Écran de rotation automatique. Si cette case n'est pas cochée, Android ne signalera pas les changements d'orientation à votre activité. Pour être clair: il ne redémarrera pas l'activité. Dans mon cas, je ne reçois que , comme vous l'avez décrit.
Vous pouvez vérifier cela depuis votre programme si vous ajoutez ces lignes à onCreate ()
int sysAutoRotate = 0;
try {
sysAutoRotate = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION);
} catch (SettingNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("ORIENTATION_TEST", "Auto-rotate Screen from Device Settings:" + sysAutoRotate);
Il renverra si la rotation automatique est désactivée et 1 si la rotation automatique est activée. Un autre essai. Dans votre programme d'origine, vous avez peut-être défini un manifeste
Android:screenOrientation="portrait"
Même effet, mais cette fois pour votre activité uniquement. Si vous avez fait le petit programme de test, cette possibilité aurait été éliminée (c'est pourquoi je le recommande).
Remarque: Oui, tout le sujet d'orientation/rotation est un sujet "intéressant". Essayez des choses, utilisez Log.d (), expérimentez, apprenez.
Si vous voulez savoir si le contenu actuellement affiché est en mode paysage ou portrait (éventuellement complètement indépendant de la rotation physique du téléphone), vous pouvez utiliser:
getResources().getConfiguration().orientation
orientation int publique
Depuis: API niveau 1
Orientation générale de l'écran. Il peut s'agir de ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT ou ORIENTATION_SQUARE.
getOrientation()
est obsolète. Essayez plutôt getRotation()
.
Pour éviter l'utilisation de méthodes obsolètes, utilisez la classe de configuration Android trouvée ici . Il fonctionne depuis l'API lvl 1 et fonctionne toujours sur les derniers appareils Android. (Non déconseillé).
Comme et par exemple, considérez l'extrait de code suivant:
Configuration config = getResources().getConfiguration();
if (config.orientation == Configuration.ORIENTATION_PORTRAIT)
{
setContentView(R.layout.portraitStart);
}
else
{
setContentView(R.layout.landscapeStart);
}
Bonne chance - j'espère que cette réponse aidera quiconque s'y heurte.
Tu devrais utiliser:
getResources().getConfiguration().orientation
Il peut s'agir de l'un des ORIENTATION_LANDSCAPE
, ORIENTATION_PORTRAIT
.
http://developer.Android.com/reference/Android/content/res/Configuration.html#orientation
Je pense que vous devez créer deux dispositions différentes et gonfler différentes dispositions selon une orientation différente. Je vous donne un exemple de code qui fonctionne bien pour moi. "contexte" vous pouvez passer de votre activité en cas d'adaptateur personnalisé. Si vous utilisez un adaptateur personnalisé, vous pouvez essayer ce code:
@Override
public View getView(final int position,
View convertView,
ViewGroup parent)
{
View rowView = convertView;
ViewHolder holder = null;
int i = context.getResources().getConfiguration().orientation;
if (rowView == null) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (i == Configuration.ORIENTATION_PORTRAIT) {
rowView = inflater.inflate(R.layout.protrait_layout, null, false);
} else {
rowView = inflater.inflate(R.layout.landscape_layout, null, false);
}
holder = new ViewHolder();
holder.button = (Button) rowView.findViewById(R.id.button1);
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();
}
return rowView;
}
autrement, vous pouvez directement définir deux dispositions différentes dans votre code
int i = context.getResources().getConfiguration().orientation;
if (i == Configuration.ORIENTATION_PORTRAIT) {
ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.protrait_layout, name);
} else {
ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.landscape_layout, name);
}
/* First, get the Display from the WindowManager */
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
/* Now we can retrieve all display-related infos */
int width = display.getWidth();
int height = display.getHeight();
int orientation = display.getOrientation();
J'ai eu le même problème sur NexusOne SDK 2.3.
Cela l'a résolu: Vérifiez l'orientation sur Android téléphone .