wake-up-neo.com

Rotation/Landschaft in einem Fragment zulassen

Meine App verfügt über eine einzige Aktivität mit einem FragmentPagerAdapter mit vier Fragmenten (Verwendung der ViewPagerIndicator-Bibliothek). Eines dieser Fragmente enthält Designs für ein separates Hoch- und Querformat, die anderen drei müssen nicht auf Hochformat ausgerichtet sein.

Mein Gedanke war, Android:configChanges="orientation" im Manifest zu setzen und getActivity().setRequestedScreenOrientation() in der onResume() aller Fragmente aufzurufen, wobei in drei von ihnen SCREEN_ORIENTATION_PORTRAIT, aber in SCREEN_ORIENTATION_UNSPECIFIED in demjenigen, der Rotation zulassen muss, gesperrt ist. Die App bleibt im Hochformat. 

Gibt es einen Weg, dies zu erreichen?

Es ist nicht unbedingt notwendig, dass die tatsächliche Aktivität rotiert, wenn es ohnehin die Möglichkeit gibt, die Ausrichtung eines Fragments ohne dessen Aktivität zu ändern, aber ich habe nichts gefunden, was dies als möglich erachtet. Es wäre auch in Ordnung, wenn sich die Aktivität dreht, da die Registerkartenleiste im Querformat ausgeblendet wird.

24
Garcon

Überschreiben Sie setUserVisibleHint() in jedem Fragment.

Im Portrait 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);
    }
}

im Portrait/Landschaftsfragment:

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

Dadurch kann sich die gesamte Aktivität in einem Fragment drehen, in anderen jedoch im Portrait.

33
Garcon

Eine Sache, die für mich funktioniert hat, war einfach zu sagen 

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

An der Spitze der OnCreateView()-Methoden für jedes der Fragmente. Sie möchten ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR durch die entsprechende SCREEN_ORIENTATION-Konstante ersetzen. 

Nachdem ich das getan hatte, funktionierte es perfekt auf ICS. Sie müssen das Manifest nicht für die bestimmte Aktivität anpassen.

10
George Baker

Problem ist, wenn Sie configChanges aktivieren, müssen Sie die onConfigurationChanged()-Methode in Ihrer Aktivität/Ihren Fragmenten behandeln.

Das heißt, wenn Sie die getActivity().setRequestedScreenOrientation() ausgelöst haben, müssten Sie setContentView() erneut manuell aufrufen, um das Landschaftslayout erneut aufzurufen.

Die Einstellung "UNSPECIFIED" ändert sich nicht in die Landschaft, sie bleibt einfach dort, wo sie 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 erneut ausgeblendet. Das bedeutet, dass Sie die letzte ViewPager-Seite nachverfolgen müssen, um sich zu vergewissern, dass das Layout neu erstellt wurde, damit es standardmäßig wieder in das Fragment eingefügt wird, bevor es dem angezeigt wird Benutzer und Fragment onResume() wird aufgerufen.

Es wird fummelig sein, aber es ist möglich.

3
Chris.Jenkins

Schreiben Sie etwas Code in AndroidManifest.xml auf dem jeweiligen Aktivitäts-Tag.

Android:configChanges="orientation|screenSize".

Und schreiben Sie Code in Fragment auf onCreateView-Methode,
für Portrait:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
setRetainInstance(true);

für Landschaft:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRetainInstance(true);
0
Virendra Kachhi

in dem Fragment, das Sie setzen möchten, fügen Sie einfach Ihre onCreate/onCreateView hinzu.

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

in den anderen Fragmenten, die Sie zulassen möchten, fügen Sie mehrere Ausrichtungen hinzu

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
0
ravid rinek