21

我的應用程序允許旋轉/橫向具有與四個片段(使用ViewPagerIndicator庫)一個FragmentPagerAdapter單個活動。其中一個片段具有單獨的縱向和橫向佈局設計,其他三個片段不需要固定到縱向方向。在一個片段

我的想法是設置android:configChanges="orientation"在清單,並呼籲getActivity().setRequestedScreenOrientation()中的所有片段的onResume(),在他們三個人,但在需要允許旋轉一個SCREEN_ORIENTATION_UNSPECIFIED鎖定到SCREEN_ORIENTATION_PORTRAIT,但這不起作用。該應用程序保持縱向模式。

有沒有辦法做到這一點?

它實際上不是必需的實際活動轉動是否有無論如何,讓一個片段來改變方向,而不其活性這樣做,但我還沒有發現任何提到這一點是可能的。如果活動旋轉也會同樣好,因爲在橫向方向上標籤欄將被隱藏。

回答

31

覆蓋setUserVisibleHint()在每個片段中。

在人像的碎片:

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if(isVisibleToUser) { 
     Activity a = getActivity(); 
     if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 
} 
在縱向/橫向片段

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

這將使整個活動在一個片段旋轉,但在它固定到肖像其他。爲我工作

+1

我不會覆蓋'setMenuVisibility'覆蓋'setUserVisible'均設置在同一時間,所以雙方應該採取行動一樣,只是讀更好的使用'UserVisible' –

2

問題是如果您啓用configChanges,則需要在您的活動/片段中處理方法。

這意味着,如果您發射getActivity().setRequestedScreenOrientation(),則必須再次手動呼叫setContentView()以重新填充橫向佈局。

還設置`未指定」不會改變爲橫向,它會只停留在哪裏。

我會用getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)的畫像碎片。 和getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)爲景觀片段。

這會重新填充活動佈局,這意味着您需要跟蹤最後一個ViewPager頁面,以確保您在佈局重新創建之後顯示默認回到該片段之前顯示給用戶,並調用片段onResume()

它去是繁瑣的,但是,它是可能的。

+0

感謝指正在configChanges的濫用和SCREEN_ORIENTATION_UNSPECIFIED – Garcon

8

的一件事是隻是把

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 

在的OnCreateView()方法每個片的頂部。 你會想要用常數代替ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR

一旦我做到了這一點,它在ICS上完美運行。您不必爲特定活動調整清單。

0

您要設置的片段只需添加到您的onCreate/onCreateView getActivity()。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 在你想允許多方向的其他片段中添加 getActivity()。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

1
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);