Allow rotation/landscape in one fragment

谁说胖子不能爱 提交于 2019-11-28 05:52:39

Override setUserVisibleHint() in each fragment.

In the portrait only fragments:

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

in the the portrait/landscape fragment:

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

This will allow the whole activity to rotate in one fragment, but fix it to portrait in others.

George Baker

One thing that worked for me was to just put

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

At the top of the OnCreateView() methods for each of the fragments. You would want to replace ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR with the appropriate SCREEN_ORIENTATION constant.

Once I did this it worked perfectly on ICS. You don't event have to adjust the manifest for the specific activity.

Issue is if you enable configChanges you then need to handle onConfigurationChanged() method in your activity/fragments.

Meaning that if you did fire the getActivity().setRequestedScreenOrientation() you would have to manually call setContentView() again to reinflate the landscape layout.

Also setting `UNSPECIFIED' will not change to landscape, it will just remain where it is.

I would use getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) for the portrait fragments. And getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) for the landscape fragments.

This will reinflate the activity layout, which means you will then need to keep track of the last ViewPager page you where on, to make sure you show that after the layout has been recreated as to default back to that fragment before they are shown to the user and fragment onResume() is called.

Its going to be fiddly but, it is possible.

Virendra Kachhi

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 Landscape:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRetainInstance(true);
ravid rinek

in the fragment you want to set just add to your onCreate/onCreateView

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

in the other fragments you want to allow multi orientation add

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!