web-dev-qa-db-fra.com

Problème d'orientation de l'écran Android 8.1: basculer en mode paysage sur un écran de portrait

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. 

  1. Parfois, passe au portrait puis au paysage et reste sur le paysage.
  2. Parfois, passe au portrait puis au paysage et enfin au portrait.

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

41
Sol

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.

13
TheTestSpecimen

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);
}
8
Krishna

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

4
VV W

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.

4
Luvnish Monga

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();
}
0
Narmi

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

0
Carlos Mion

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);
        }
    }
}
0
PerracoLabs

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.

0
Taras Vovkovych