web-dev-qa-db-fra.com

Autoriser la rotation/paysage dans un fragment

Mon application a une seule activité avec un FragmentPagerAdapter avec quatre fragments (Utilisation de la bibliothèque ViewPagerIndicator). L'un de ces fragments présente des dessins pour une mise en page portrait et paysage séparée, les trois autres ne le sont pas et doivent être fixés sur l'orientation portrait.

Mon idée était de définir Android:configChanges="orientation" dans le manifeste et d’appeler getActivity().setRequestedScreenOrientation() dans la onResume() de tous les fragments, en verrouillant SCREEN_ORIENTATION_PORTRAIT sur trois, mais SCREEN_ORIENTATION_UNSPECIFIED dans celui qui doit permettre la rotation, mais cela ne fonctionne pas. L'application reste en mode portrait. 

Y a-t-il un moyen d'y parvenir?

En réalité, il n'est pas nécessaire que l'activité réelle effectue une rotation si un fragment peut de toute façon changer d'orientation sans le faire, mais je n'ai rien trouvé qui dise que cela est possible. Ce serait également correct si l'activité tournait car la barre de tabulation serait masquée en orientation paysage.

24
Garcon

Remplacer setUserVisibleHint() dans chaque fragment.

Dans le portrait seulement des fragments:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser) {
        Activity a = getActivity();
        if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

dans le fragment portrait/paysage:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser) {
        Activity a = getActivity();
        if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    }
}

Cela permettra à l’ensemble de l’activité de tourner dans un fragment, mais de le corriger en portrait dans d’autres.

33
Garcon

Une chose qui a fonctionné pour moi a été de simplement mettre 

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

Au sommet des méthodes OnCreateView() pour chacun des fragments. Vous voudriez remplacer ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR par la constante SCREEN_ORIENTATION appropriée. 

Une fois que cela a été fait, cela a parfaitement fonctionné avec ICS. Vous n'avez pas besoin d'ajuster le manifeste pour l'activité spécifique.

10
George Baker

Le problème est que si vous activez configChanges, vous devez alors gérer la méthode onConfigurationChanged() dans votre activité/fragments.

Cela signifie que si vous avez déclenché le getActivity().setRequestedScreenOrientation(), vous devrez à nouveau appeler manuellement setContentView() pour regonfler la disposition en paysage.

De plus, le réglage "NON SPÉCIFIÉ" ne changera pas en mode paysage, il restera simplement là où il est.

Je voudrais utiliser getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) pour les fragments de portrait . Et getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) pour les fragments de paysage.

Cela réinitialisera la présentation de l'activité, ce qui signifie que vous devrez ensuite garder une trace de la dernière page du ViewPager sur laquelle vous vous êtes positionné, pour vous assurer que vous montrerez qu'après que la présentation a été recréée de manière à revenir par défaut à ce fragment avant d'être affichée au répertoire. user and fragment onResume() est appelé.

Sa va être difficile, mais c'est possible.

3
Chris.Jenkins

Écrivez du code dans AndroidManifest.xml sur la balise d'activité particulière.

Android:configChanges="orientation|screenSize".

Et écrivez du code dans Fragment on onCreateView,
pour Portrait:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
setRetainInstance(true);

pour le paysage:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRetainInstance(true);
0
Virendra Kachhi

dans le fragment que vous souhaitez définir, ajoutez simplement à votre variable onCreate/onCreateView

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

dans les autres fragments que vous souhaitez autoriser, ajoutez plusieurs orientations

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
0
ravid rinek