21

Meine App hat eine einzelne Aktivität mit einem FragmentPagerAdapter mit vier Fragmenten (mit der ViewPagerIndicator-Bibliothek). Eines dieser Fragmente hat Designs für ein separates Hoch- und Querformat, die anderen drei müssen nicht im Hochformat fixiert werden.Erlaube Rotation/Landschaft in einem Fragment

Mein Gedanke war android:configChanges="orientation" im Manifest zu setzen und rufen getActivity().setRequestedScreenOrientation() im onResume() aller Fragmente, zu SCREEN_ORIENTATION_PORTRAIT in drei von ihnen Verriegelungs aber zu SCREEN_ORIENTATION_UNSPECIFIED in der, die Drehung ermöglichen muss, aber das funktioniert nicht. Die App bleibt im Hochformat.

Gibt es einen Weg, dies zu erreichen?

Es ist eigentlich nicht notwendig, dass sich die eigentliche Aktivität dreht, wenn es trotzdem einem Fragment erlaubt, die Ausrichtung ohne seine Aktivität zu ändern, aber ich habe nichts gefunden, was dies möglich macht. Es wäre auch in Ordnung, wenn sich die Aktivität dreht, da die Tableiste im Querformat ausgeblendet wird.

Antwort

31

In jedem Fragment setUserVisibleHint() überschreiben.

Im Porträt nur Fragmente:

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

in der das Porträt/Landschaft Fragmente:

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

Dies wird die gesamte Aktivität erlaubt in einem Fragmente zu drehen, aber es Porträt fixieren Andere.

+1

Ich würde die 'setMenuVisibility' Überschreibung außer Kraft setzen' setUserVisible' sie beide auf der gleichen Zeit sind, so sollten beide gleich handeln, gerade liest sich besser mit 'UserVisible' –

2

Problem ist, wenn Sie configChanges aktivieren Sie müssen dann Methode in Ihrer Aktivität/Fragmente behandeln.

Das heißt, wenn Sie die getActivity().setRequestedScreenOrientation() feuern würden, müssten Sie manuell setContentView() erneut aufrufen, um das Landschaftslayout neu zu füllen.

Auch das Setzen von 'SEAKTIV' wird nicht in Landschaft geändert, es bleibt einfach dort, wo es ist.

Ich würde getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) für die Portraitfragmente verwenden. Und getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) für die Landschaftsfragmente.

Dadurch wird das Aktivitätslayout neu angelegt. Das bedeutet, dass Sie die letzte ViewPager-Seite, auf der Sie sich befinden, verfolgen müssen, um sicherzustellen, dass das Layout nach der Wiederherstellung des ursprünglichen Fragments wieder angezeigt wird werden dem Benutzer angezeigt und das Fragment onResume() wird aufgerufen.

Es wird fummelig, aber es ist möglich.

+0

Dank für mich auf den Missbrauch von configChanges korrigieren und SCREEN_ORIENTATION_UNSPECIFIED – Garcon

8

Eine Sache, die für mich gearbeitet wurde nur an der Spitze der OnCreateView() Methoden für jedes der Fragmente

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 

setzen. Sie möchten ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR durch die entsprechende Konstante SCREEN_ORIENTATION ersetzen.

Sobald ich das getan habe, funktionierte es perfekt auf ICS. Sie müssen das Manifest für die spezifische Aktivität nicht anpassen.

0

in das Fragment, das Sie festlegen möchten, fügen Sie einfach Ihre onCreate/onCreateView getActivity(). SetRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); in den anderen Fragmenten, die Multiorientierung zulassen möchten, fügen Sie hinzu 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);