web-dev-qa-db-fra.com

Verrouiller l'orientation de l'écran lors du ciblage Android API 27 avec une activité non opaque

J'ai une activité pour laquelle Android:windowIsTranslucent Est défini sur true et Android:windowBackground Sur un arrière-plan translucide. Je viens de changer ma cible et de compiler la version de sdk à 27, et je reçois une exception lors du lancement de cette activité maintenant:

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

Comme il s’agit d’un nouveau sdk, il n’ya encore rien en ligne (et 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 )

Y a-t-il un moyen de contourner cela? L'application ne se bloque pas si je retire Android:screenOrientation="portrait" De mon manifeste pour cette activité, mais j'aimerais pouvoir la conserver comme cela.

35
vanshg

J'ai aussi fait face au même problème. Comme d'autres l'ont dit, si je supprimais Android: screenOrientation = "portrait" ou le remplaçais par Android: screenOrientation = "non spécifié", l'exception avait disparu. Et il semble que l'orientation de l'activité avant suit celle de l'activité arrière.

J'y ai pensé. Si l'activité en façade est transparente et que l'orientation de l'activité en arrière est différente, l'affichage devient étrange. Je peux donc comprendre pourquoi cette logique de vérification a été ajoutée. Cependant, je me demande bien pourquoi ce problème ne s'est pas produit dans Developer Preview 8.0.0.

32
Takao Sumitomo

La solution consiste à redéfinir targetSdk sur 26.

La raison pour laquelle 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é pour Google. Cela a été corrigé, mais nous ne savons pas quand et comment il sera publié.


Je peux également confirmer ce que "sofakingforever" dit dans les commentaires: s'il y a une activité non translucide à orientation fixe derrière votre translucide, le translucide ne tournera pas. Vous pouvez donc simplement supprimer Android:screenOrientation="portrait" du manifeste aussi.

17
JerabekJakub

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, pour 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);
    }
}
6
omersem

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>
3
Venkatesh

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.

2
Diogo Rosa

il semble que ce soit une nouvelle fonctionnalité/bogue sur l'API 27. Cependant, vous pouvez supprimer Android: screenOrientation Ou Android: screenOrientation = "non spécifié"

1
Brahem Mohamed

Merci @JerabekJakub. Mon résultat de test - garder sdk 27 ​​et supprimer les lignes suivantes peut également résoudre le problème.

 Android:configChanges="orientation"
 Android:screenOrientation="portrait"
0
flame3