36 votes

Verrouiller l'orientation de l'écran lorsque vous ciblez l'API Android 27 avec une activité non opaque

J'ai une activité qui a android:windowIsTranslucent ensemble de true et android:windowBackground ensemble pour un translucide arrière-plan. Je viens de changer mon objectif et compiler version du sdk à 27, et j'obtiens une exception lors du lancement de cette activité:

java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

Puisque c'est un nouveau sdk, il n'y a pas quelque chose en ligne à ce sujet (mais il semble résulter de cette ligne de code: https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/Activity.java#987 )

Est-il un moyen de contourner ce problème? L'application ne plante pas si je sors android:screenOrientation="portrait" de mon manifeste pour cette activité, mais je voudrais être en mesure de le garder comme ça.

34voto

Takao Sumitomo Points 1

J'ai aussi été confronté au même problème. Comme les autres ont dit, Si j'ai supprimé android:screenOrientation="portrait" ou surdéfini avec android:screenOrientation="non spécifié", alors, l'exception a disparu. Et il semble que le front de l'activité de l'orientation suit le derrière de l'activité de l'orientation.

J'ai pensé à ce sujet. Si le front de l'activité est transparent et le derrière de l'activité de l'orientation est différente, l'affichage devient étrange. Donc, je peux comprendre pourquoi cette logique de contrôle a été ajouté Cependant, je me demande pourquoi ce problème n'a pas été produite en Developer Preview 8.0.0.

16voto

JerabekJakub Points 3927

La solution de contournement consiste à définir targetSdk de retour à l' 26.

La raison en est que votre application se bloque est ici, dans ce commit.

Comme vous pouvez le voir ici, vous n'êtes pas le seul - ce problème a été signalé à Google en tant que problème. Il a été résolu, mais nous ne savons pas comment et quand il sera libéré.


Je peux aussi confirmer que "sofakingforever", dit dans les commentaires, s'il y a non-translucide activité à orientation fixe derrière votre translucide translucide ne tournera pas. Ainsi, vous pouvez simplement supprimer android:screenOrientation="portrait" de manifester ainsi.

7voto

omersem Points 333

La solution a fonctionné pour moi est la suppression

 android:screenOrientation="portrait" 
 

de toutes les activités transparentes plein écran qui signifie que leur thème contient

 <item name="android:windowIsTranslucent">true</item>
 

De plus, afin de m'assurer que l'orientation fonctionne correctement pour Oreo, j'ai ajouté cela à la fonction onCreate () des activités.

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // This activity is a fullscreen transparent activity, so after Oreo Android doesn't allow fullscreen
    // transparent activities to specify android:screenOrientation="portrait" in the manifest. It will pick up
    // from the background activity. But for below Oreo we should make sure that requested orientation is portrait.
    if (VERSION.SDK_INT < VERSION_CODES.O) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}
 

3voto

Venkatesh Points 704

J'ai résolu ce problème en modifiant cette ligne dans les styles NoActionBar

Dans la version cible 27 seulement, j'ai eu ce problème et j'ai résolu en utilisant la ligne ci-dessous

 <item name="android:windowIsTranslucent">false</item>
 

2voto

Diogo Rosa Points 412

Donc ce que j’ai fait, c’est de supprimer toute propriété screenOrientation du manifeste et de l’ajouter à mon BaseActivity (à partir de laquelle toutes mes activités s’étendent), ce code

  if(!(this instanceof TranslucentActivity)){
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
 

L'activité translucide aura l'orientation de l'activité derrière.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X