android - viewpager - fragmentpageradapter example
Permitir rotaciĆ³n/paisaje en un fragmento (5)
El problema es si habilitas configChanges
, entonces necesitas manejar el onConfigurationChanged()
en tu actividad / fragmentos.
Lo que significa que si getActivity().setRequestedScreenOrientation()
, tendría que llamar manualmente a setContentView()
nuevamente para volver a inflar el diseño del paisaje.
Además, al establecer `SIN ESPECIFICAR ''no cambiará a paisaje, simplemente permanecerá donde está.
Utilizaría getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
para los fragmentos de retrato. Y getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)
para los fragmentos de paisaje.
Esto volverá a inflar el diseño de la actividad, lo que significa que necesitará realizar un seguimiento de la última página de ViewPager en la que se encontraba, para asegurarse de mostrar que después de que el diseño se haya recreado de forma predeterminada vuelva a ese fragmento antes de que se muestren al usuario y fragmento onResume()
es llamado.
Va a ser complicado pero, es posible.
Mi aplicación tiene una sola actividad con un FragmentPagerAdapter con cuatro fragmentos (usando la biblioteca ViewPagerIndicator). Uno de estos fragmentos tiene diseños para un retrato y un diseño de paisaje por separado, los otros tres no y deben ser fijados a la orientación vertical.
Mi idea era establecer android:configChanges="orientation"
en el manifiesto y llamar a getActivity().setRequestedScreenOrientation()
en el onResume()
de todos los fragmentos, bloqueando SCREEN_ORIENTATION_PORTRAIT
en tres de ellos pero a SCREEN_ORIENTATION_UNSPECIFIED
en el que necesita permite la rotación, pero esto no funciona. La aplicación permanece en modo vertical.
¿Hay una manera de lograr esto?
En realidad, no es necesario que la actividad real gire para permitir que un fragmento cambie de orientación sin que su actividad lo haga, pero no he encontrado nada que mencione que esto sea posible. También sería igual de aceptable si la actividad gira ya que la barra de pestañas se ocultará cuando esté en orientación horizontal.
Reemplazar setUserVisibleHint()
en cada fragmento.
En el retrato solo fragmentos:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
en el fragmento retrato / paisaje:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}
}
Esto permitirá que toda la actividad gire en un fragmento, pero lo arregle en otros.
Una cosa que funcionó para mí fue simplemente poner
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
En la parte superior de los métodos OnCreateView()
para cada uno de los fragmentos. Desea reemplazar ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
con la constante SCREEN_ORIENTATION
adecuada.
Una vez que hice esto, funcionó perfectamente en ICS. No tiene que ajustar el manifiesto para la actividad específica.
en el fragmento que desea establecer simplemente agregue a su onCreate / onCreateView getActivity (). setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); en los otros fragmentos que desea permitir la orientación múltiple, agregue getActivity (). setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
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);