J'ai toutes les activités en mode portrait sauf celle que j'utilise pour lire une vidéo toujours au format paysage. J'ai trouvé que sur Android 8.1, chaque fois que j'ouvre l'activité vidéo et que je la ferme, l'activité précédente passe en mode paysage même si elle est définie sur "portrait" dans le manifeste.
Cela ne se produit que lorsque vous revenez d'une activité que c'est du paysage.
Il y a quelqu'un qui vit cela?
Merci.
MODIFIER
Je rapporte le bug sur Google: https://issuetracker.google.com/issues/69168442
EDIT 2
Il semble fixé sur Android 9
Je viens de rencontrer ce problème dans ma propre application.
La solution qui fonctionne pour moi est la suivante:
onCreate(){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
onPause(){
if (Android.os.Build.VERSION.SDK_INT >= 27) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
}
}
onResume(){
if (Android.os.Build.VERSION.SDK_INT >= 27) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
}
Le code ci-dessus doit aller à l’activité qui est en mode paysage (c’est-à-dire la deuxième activité et celle depuis laquelle vous appuyez sur le bouton Précédent).
J'aimerais souligner que cette solution n'était pas la mienne et je l'ai tirée du message n ° 20 au lien suivant (qui est également noté dans le PO):
https://issuetracker.google.com/issues/69168442
Je pensais simplement que les gens pourraient y accéder plus facilement s'ils n'avaient pas à chercher une autre page.
Cela a résolu le problème.
Remplacez la méthode onBackPressed () de l'activité Paysage et définissez l'orientation sur Portrait.
@Override
public void onBackPressed() {
super.onBackPressed();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Si vous avez DialogTheme comme theme = Theme.AppCompat.Light.Dialog dans votre manifeste, supprimez la balise d'orientation définie pour cette activité de dialogue du manifeste.
et pour ci-dessous les versions placent ceci sur oncreate
if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
et définir le thème de l'application Theme.AppCompat.Light.DarkActionBar pas besoin d'ajouter le thème aux activités
L'utilisation de intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
dans l'activité précédente a résolu mon problème.
Pour résoudre ce problème:
Lorsque vous revenez à l'activité A à partir de l'activité B et si vous connaissez l'orientation de l'écran de l'activité A, définissez l'orientation de l'écran de manière à ce que la destruction de l'activité B soit terminée.
@Override
protected void onDestroy() {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
super.onDestroy();
}
sur la méthode onCreate de chaque activité insérez cette ligne
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
pour le paysage et
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
pour les portraits
La solution de contournement suivante peut vous aider à résoudre le problème.
Vous devez étendre toutes vos activités en utilisant celle du code. Il prend soin de définir et de restaurer les orientations correctes chaque fois que les méthodes onPause/onResume sont appelées.
La solution de contournement fonctionnera pour tout type d'orientation défini dans les balises d'activité du manifeste.
Pour mes propres besoins, j'étend cette classe à partir de ComponentActivity , vous pouvez donc modifier le paramètre pour qu'il étende à Activity , ActivityCompat , ou à tout type d'activité que vous utilisez dans votre code.
public abstract class AbsBaseActivity extends ComponentActivity
{
private int currentActivityOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
private int parentActivityOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@CallSuper
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.cacheOrientations();
}
private void cacheOrientations()
{
if (this.currentActivityOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
{
final Intent parentIntent = this.getParentActivityIntent();
if (parentIntent != null)
{
final ComponentName parentComponentName = parentIntent.getComponent();
if (parentComponentName != null)
{
this.currentActivityOrientation = this.getConfiguredOrientation(this.getComponentName());
this.parentActivityOrientation = this.getConfiguredOrientation(parentComponentName);
}
}
}
}
private int getConfiguredOrientation(@NonNull final ComponentName source)
{
try
{
final PackageManager packageManager = this.getPackageManager();
final ActivityInfo activityInfo = packageManager.getActivityInfo(source, 0);
return activityInfo.screenOrientation;
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
}
return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
}
@CallSuper
@Override
protected void onPause()
{
if (this.parentActivityOrientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
{
this.setRequestedOrientation(this.parentActivityOrientation);
}
super.onPause();
}
@CallSuper
@Override
protected void onResume()
{
super.onResume();
if (this.currentActivityOrientation != ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
{
this.setRequestedOrientation(this.currentActivityOrientation);
}
}
}
J'avais un tel problème et j'essayais tous les cas d'utilisation ci-dessus ... La plupart d'entre eux fonctionnent, mais vous devez savoir un cas:
La dernière raison était l'utilisation de fragments à l'intérieur d'une structure de contenu d'activité dans le cas de Android 8. Par exemple: l'activité est lancée en mode Paysage, mais le fragment vous montre la mise en page Portrait.
Essayez d'éviter les fragments.