Permettre la rotation / paysage en un seul fragment

mon application a une seule activité avec un FragmentPagerAdapter avec quatre fragments (en utilisant la bibliothèque ViewPagerIndicator). L'un de ces fragments a des dessins pour un portrait et un paysage séparés, les trois autres n'ont pas besoin d'être fixés à l'orientation du portrait.

ma pensée était de mettre android:configChanges="orientation" dans le manifeste et appeler getActivity().setRequestedScreenOrientation() dans le <!-De tous les fragments, verrouillage sur SCREEN_ORIENTATION_PORTRAIT dans trois d'entre eux, mais SCREEN_ORIENTATION_UNSPECIFIED dans celle qui doit permettre la rotation, mais cela ne fonctionne pas. L'application reste en mode portrait.

Est-il un moyen pour y parvenir?

il n'est pas réellement nécessaire que l'activité réelle tourne s'il y a de toute façon de permettre à un fragment de changer d'orientation sans que son activité le fasse, mais je n'ai rien trouvé qui mentionne que ce soit possible. Il serait également acceptable que l'activité tourne puisque la barre de tabulation sera cachée lorsqu'elle est orientée vers le paysage.

22
demandé sur Garcon 2012-11-06 17:19:53

5 réponses

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 fixer portrait dans d'autres.

32
répondu Garcon 2012-11-06 14:19:41

une chose qui a fonctionné pour moi était juste de mettre

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

au sommet de la OnCreateView() méthodes pour chacun des fragments. Vous voulez remplacer ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR avec le SCREEN_ORIENTATION constante.

une fois que j'ai fait ceci cela a fonctionné parfaitement sur ICS. Vous n'avez pas besoin d'ajuster le Manifeste pour l'activité spécifique.

9
répondu George Baker 2015-05-06 13:17:01

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

ce qui signifie que si vous avez tiré le getActivity().setRequestedScreenOrientation() vous devez manuellement appeler setContentView() encore une fois pour renifler la disposition du paysage.

en outre, le fait de définir `UNSPECIFIED' ne changera pas le paysage, il restera 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.

réinflater la mise en page de l'activité, ce qui signifie que vous devrez alors garder la trace de la dernière page de ViewPager où vous vous trouvez, pour vous assurer que vous montrez qu'après la mise en page a été recréé comme par défaut retour à ce fragment avant qu'ils ne sont montrés à l'utilisateur et fragment onResume() est appelée.

cela va être fiddement mais, c'est possible.

2
répondu Chris.Jenkins 2012-11-06 13:33:57

dans le fragment que vous voulez définir ajouter à votre onCreate / onCreateView getActivity ().setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); dans les autres fragments vous voulez permettre multi orientation ajouter getActivity ().setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

0
répondu ravid rinek 2017-06-03 10:50:43
Write some code in "AndroidManifest.xml" on the particular activity tag.
 android:configChanges="orientation|screenSize".

And Write code in Fragment on "onCreateView" method,    
for Portrait:
 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
 setRetainInstance(true);

for Lansscape:
  getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
  setRetainInstance(true);
0
répondu Virendra Kachhi 2018-02-09 14:21:46