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.
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.
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.
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);
}
}
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>
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.
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é"
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"