Je souhaite que les tablettes puissent s'afficher en mode portrait et paysage (sw600dp ou supérieur), mais les téléphones doivent être limités au portrait uniquement. Je ne trouve aucun moyen de choisir conditionnellement une orientation. Aucune suggestion?
android
tablet
screen-orientation
Kenny Wyland
la source
la source
layout-land
interneres
.Réponses:
Voici un bon moyen d'utiliser les ressources et les qualificatifs de taille .
Mettez cette ressource booléenne dans res / values sous forme de bools.xml ou autre (les noms de fichiers n'ont pas d'importance ici):
Mettez celui-ci dans res / values-sw600dp et res / values-xlarge:
Consultez cette réponse supplémentaire pour obtenir de l'aide sur l'ajout de ces répertoires et fichiers dans Android Studio.
Ensuite, dans la méthode onCreate de vos activités, vous pouvez le faire:
Les appareils qui sont plus de 600 dp dans le sens de la largeur la plus petite, ou x-large sur les dispositifs de pré-applications 3.2 (comprimés, essentiellement) se comportent comme d' habitude, la rotation sur la base de capteur et verrouillé par l' utilisateur, etc . Tout le reste (téléphones, à peu près) sera uniquement portrait.
la source
xlarge
aussi ou puis-je simplement utilisersw600dp
? Il n'y a probablement plus de tablettes fonctionnant sous 3,2 ces jours-ci.onCreate()
. Lorsque j'ai déplacé l'appel àsetRequestedOrientation()
une position différente dans le temps et dans le contexte, le redémarrage n'a plus eu lieu.Vous pouvez essayer de cette façon d'abord obtenir la taille de l'écran de l'appareil
puis définissez l'orientation en fonction de cela
la source
Configuration
fournit desscreenLayout
informations - DPI. Alors que la question est liée à la taille de l'écran de l'appareil physique - téléphone VS tablette.Configuration.SCREENLAYOUT_SIZE_NORMAL
Cela signifie que vous pouvez avoir un et ce serait une tablette MDPI.Complément à la réponse acceptée
Vous pouvez effectuer les étapes suivantes dans Android Studio pour ajouter les répertoires
res/values-sw600dp
etres/values-large
avec leursbools.xml
fichiers.valeurs-sw600dp
Tout d'abord, dans l'onglet Projet, sélectionnez le filtre Projet (plutôt qu'Android) dans le navigateur.
Cliquez ensuite avec le bouton droit sur le
app/src/main/res
répertoire. Choisissez Nouveau > Répertoire de ressources Android .Sélectionnez la plus petite largeur d'écran , puis appuyez sur le bouton >> .
Tapez
600
pour la plus petite largeur d'écran. Le nom du répertoire sera généré automatiquement. Dis OK.Cliquez ensuite avec le bouton droit sur le
values-sw600dp
fichier nouvellement créé . Choisissez Nouveau > Fichier de ressources de valeurs . Saisissezbools
le nom.valeurs-grandes
L'ajout d'un
values-large
répertoire n'est nécessaire que si vous prenez en charge la version antérieure à Android 3.2 (niveau d'API 13). Sinon, vous pouvez sauter cette étape. Levalues-large
répertoire correspond àvalues-sw600dp
. (values-xlarge
correspond àvalues-sw720dp
.)Pour créer le
values-large
répertoire, suivez les mêmes étapes que ci-dessus, mais dans ce cas, choisissez Taille plutôt que Plus petite largeur d'écran. Sélectionnez Large . Le nom du répertoire sera généré automatiquement.Cliquez avec le bouton droit sur le répertoire comme précédemment pour créer le
bools.xml
fichier.la source
Voici comment je l'ai fait (inspiré par http://androidblogger.blogspot.com/2011/08/orientation-for-both-phones-and-tablets.html ):
Dans AndroidManifest.xml, pour chaque activité, vous souhaitez pouvoir basculer entre portrait et paysage (assurez-vous d'ajouter screenSize - vous n'en aviez pas besoin auparavant!) Vous n'avez pas besoin de définir une orientation de l'écran ici. :
Méthodes à ajouter dans chaque activité:
et: (si vous ne remplacez pas cette méthode, l'application appellera onCreate () lors du changement d'orientation)
Dans onCreate () de chaque activité:
La seule chose que je n'arrive pas à comprendre, c'est comment faire pour que l'application change les fichiers de mise en page lors du passage du paysage au portrait ou vice versa. Je suppose que la réponse fait quelque chose de similaire à ce que fait le lien ci-dessus, mais je n'ai pas pu faire fonctionner cela pour moi - cela a supprimé toutes mes données. Mais si vous avez une application assez simple pour avoir le même fichier de mise en page pour le portrait et le paysage, cela devrait fonctionner.
la source
Suite à la réponse de Ginny , je pense que le moyen le plus fiable de le faire est le suivant:
Comme décrit ici , mettez un booléen dans resources sw600dp. Il doit avoir le préfixe sw sinon cela ne fonctionnera pas correctement:
dans res / values-sw600dp / dimens.xml
dans res / values / dimens.xml
Ensuite, créez une méthode pour récupérer ce booléen:
Et une activité de base à étendre à partir des activités pour lesquelles vous souhaitez ce comportement:
Ainsi, chaque activité étendrait BaseActivity:
Important : même si vous étendez de
BaseActivity
, vous devez ajouter la ligneandroid:configChanges="orientation|screenSize"
à chacunActivity
dans votre AndroidManifest.xml:la source
Eh bien, c'est un peu tard mais, voici une solution XML-Only mais une solution de hack qui ne recrée pas une activité comme
setRequestedOrientation
si elle doit changer d'orientation:https://stackoverflow.com/a/27015879/1281930
la source
Suite à la réponse acceptée , j'ajoute le fichier kotlin avec la solution en espérant que cela aide quelqu'un
Mettez cette ressource booléenne en
res/values
tant que bools.xml ou autre (les noms de fichiers n'ont pas d'importance ici):Mettez celui-ci
res/values-sw600dp
etres/values-sw600dp-land
:Ensuite, ajoutez-le dans les lignes ci-dessous dans votre activité ou fragmentvity
la source
Les autres solutions n'ont pas fonctionné pour moi. J'avais encore un problème d'orientation étrange avec les dialogues et les problèmes de loisirs. Ma solution était d'étendre l'activité, en la forçant comme portrait dans le manifeste.
Exemple:
manifest.xml:
dans l'activité de l'écran de démarrage:
la source
Vieille question que je connais. Afin d'exécuter votre application toujours en mode portrait, même lorsque l'orientation peut être ou est permutée, etc. (par exemple sur les tablettes), j'ai conçu cette fonction qui est utilisée pour régler l'appareil dans la bonne orientation sans avoir besoin de savoir comment le portrait et le paysage les fonctionnalités sont organisées sur l'appareil.
Fonctionne comme un charme!
AVIS: modifiez
this.activity
votre activité ou ajoutez-la à l'activité principale et supprimez-lathis.activity
;-)Si vous voulez faire le contraire, vous devez changer le code en paysage (mais je pense que la façon de procéder est claire).
la source
Malheureusement, l'utilisation de la méthode setRequestedOrientation (...) entraînera le redémarrage de l'activité, donc même si vous l'appelez dans la méthode onCreate, elle passera par le cycle de vie de l'activité, puis recréera la même activité dans l'orientation demandée. Donc, à la réponse de @Brian Christensen, vous devez considérer que le code d'activité peut être appelé deux fois, cela pourrait avoir des effets néfastes (non seulement visuels, mais aussi aux demandes du réseau, aux analyses, etc.).
De plus, définir l'attribut configChanges dans le manifeste est à mon avis un gros compromis, qui pourrait entraîner un coût de refactoring massif. Les développeurs Android ne recommandent pas de modifier cet attribut .
Enfin, essayer de définir screenOrientation d'une manière ou d'une autre différente (pour éviter le problème de redémarrage) est impossible, statiquement impossible en raison du manifeste statique qui ne peut pas être modifié, par programme, il n'est possible d'appeler cette méthode que dans l'activité déjà démarrée.
Résumé: À mon avis, la suggestion de @Brian Christensen est le meilleur compromis, mais soyez conscient du problème de redémarrage de l'activité.
la source