web-dev-qa-db-fra.com

Définition de l'orientation pour 1 seul fragment de mon activité, le reste étant en portrait

Mon application doit être en mode portrait, je la configure donc comme suit:

Android:screenOrientation="portrait"

Mais j'ai récemment ajouté un autre fragment (FragA) qui a tout simplement l'air et qui fonctionne 10 fois mieux dans le paysage. Y a-t-il quelque chose que je puisse mettre dans mon FragA pour créer ce fragment en mode paysage tout en conservant le reste de l'application en portrait ou, ce faisant, devrai-je ajouter quelque chose à mes autres fragments pour les conserver en tant que portrait?

35
John Ubonty

L'attribut Orientation est par activité. Vous ne pouvez donc déclarer l'orientation que pour l'activité qui contient le fragment, de sorte qu'elle soit en mode paysage et que le reste des activités reste tel quel.

13
Dinesh Venkata

Utilisez la ligne de code suivante dans le fragment où vous souhaitez une orientation spécifique (dans ce cas, portrait).

getActivity().setRequestedOrientation(
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Si vous souhaitez avoir une orientation dans un fragment, en fonction de la manière dont l'utilisateur gère son appareil, utilisez la ligne de code suivante.

getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

J'espère que cela vous donnera la solution voulue.

86
pradeep.k

Dans chacun de vos fragments, définissez l'orientation demandée.

Référence doc: http://developer.Android.com/reference/Android/content/pm/ActivityInfo.html

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   // Fragment locked in portrait screen orientation
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);    

   // Fragment locked in landscape screen orientation
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

   // Fragment screen orientation normal both portait and landscape       
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
15

Dans votre fragment FragA:

@Override
public void onResume() {
    super.onResume();
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

}


@Override
public void onPause() {
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    super.onPause();
}

onPause code de méthode assure votre activité en orientation portrait

1
Cristian Chávez

Donc, je traite de cette question maintenant. Nous n'avons que portrait application en mode (pour l'instant). Mais il y a un fragment qui doit être dans paysage . Nous utilisons l’approche d’une seule activité pour que la réponse acceptée ne m’aide pas.

La solution la plus rapide à laquelle je pouvais penser est celle-ci.

private var swappingOrientation = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    if(savedInstanceState == null) {
        swappingOrientation = true
        activity?.apply {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        }
    }
}

override fun onDestroy() {
    super.onDestroy()

    if(!swappingOrientation) {
        activity?.apply {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }
    }
    swappingOrientation = false
}

Vous conservez les informations si vous permutez l'orientation ou non dans swappingOrientation variable. Au début, lorsque le fragment est créé, il changera d'orientation, uniquement lorsqu'il n'y a pas d'état sauvegardé. Et l'orientation est modifiée à nouveau uniquement lorsqu'elle n'est pas en cours de modification.

C'est une solution très rapide qui peut produire un clignotement de l'écran lorsque vous revenez au fragment précédent. Je n’ai pas non plus testé complètement le système, ce qui peut poser d’autres problèmes, alors gardez cela à l’esprit.

0
David Sucharda