可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
My app has a single Activity with a FragmentPagerAdapter with four fragments (Using the ViewPagerIndicator library). One of these fragments has designs for both a separate portrait and landscape layout, the other three do not and need to be fixed to portrait orientation.
My thought was to set android:configChanges="orientation"
in the manifest and call getActivity().setRequestedScreenOrientation()
in the onResume()
of all the fragments, locking to SCREEN_ORIENTATION_PORTRAIT
in three of them but to SCREEN_ORIENTATION_UNSPECIFIED
in the one that needs to allow rotation, but this doesn't work. The app remains in portrait mode.
Is there a way to achieve this?
It isn't actually necessary for the actual activity to rotate if there is anyway to allow a fragment to change orientation without its activity doing so, but I have not found anything mentioning this being possible. It would also be equally ok if the activity rotates since the tab bar will be hidden when in landscape orientation.
回答1:
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.
回答2:
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.
回答3:
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.
回答4:
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);
回答5:
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);