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.
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.
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.
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.
É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);
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);