webentwicklung-frage-antwort-db.com.de

Festlegen der Ausrichtung für nur 1 Fragment in meiner Aktivität, während der Rest im Portrait ist

Meine App muss sich im Hochformat befinden, damit ich sie im Manifest einstellen kann:

Android:screenOrientation="portrait"

Ich habe aber kürzlich ein weiteres Fragment (FragA) hinzugefügt, das in Landschaft 10x besser aussieht und funktioniert. Gibt es etwas, das ich in meine FragA einfügen kann, um dieses Fragment einfach in der Landschaft zu erstellen und dabei den Rest der App im Portrait zu behalten. Wenn ich dies tue, muss ich meinen anderen Fragmenten etwas hinzufügen, um sie als Portrait zu behalten.

35
John Ubonty

Das Orientierungsattribut ist pro Aktivität. Sie können also nur die Orientierung für die Aktivität angeben, die das Fragment enthält, sodass es sich im Querformat befindet und die übrigen Aktivitäten unverändert bleiben.

13
Dinesh Venkata

Verwenden Sie die folgende Codezeile im Fragment, an der Sie eine bestimmte Ausrichtung (in diesem Fall Hochformat) haben möchten.

getActivity().setRequestedOrientation(
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Wenn Sie eine Orientierung in einem Fragment haben möchten, die auf der Art basiert, wie der Benutzer sein Gerät hält, verwenden Sie die folgende Codezeile.

getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

Hoffe, das wird dir die beabsichtigte Lösung geben.

86
pradeep.k

Legen Sie in jedem Ihrer Fragmente die gewünschte Ausrichtung fest.

Referenzdokument: http://developer.Android.com/reference/Android/content/pm/ActivityInfo.html

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);

   // Fragment locked in portrait screen orientation
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);    

   // Fragment locked in landscape screen orientation
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

   // Fragment screen orientation normal both portait and landscape       
   getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}

In deinem Fragment FragA:

@Override
public void onResume() {
    super.onResume();
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

}


@Override
public void onPause() {
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    super.onPause();
}

onPause method code stellt sicher, dass Ihre Aktivität wieder im Hochformat ist

1

Also beschäftige ich mich jetzt mit diesem Thema. Wir haben nur PortraitMode-Anwendung (vorerst). Es gibt jedoch ein Fragment, das in landscape sein muss. Wir verwenden den Ansatz der Einzelaktivität, sodass mir die akzeptierte Antwort nicht weiterhilft.

Die schnellste Lösung, die ich mir vorstellen konnte, ist diese.

private var swappingOrientation = false

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    if(savedInstanceState == null) {
        swappingOrientation = true
        activity?.apply {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        }
    }
}

override fun onDestroy() {
    super.onDestroy()

    if(!swappingOrientation) {
        activity?.apply {
            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        }
    }
    swappingOrientation = false
}

Sie halten die Informationen, wenn Sie in swappingOrientation variable die Orientierung wechseln oder nicht. Zu Beginn, wenn das Fragment erstellt wird, ändert sich die Ausrichtung nur, wenn kein gespeicherter Status vorliegt. Und die Orientierung wird nur dann wieder geändert, wenn sie aktuell nicht geändert wird.

Dies ist eine superschnelle Lösung und kann zu Bildschirmblinken führen, wenn Sie zum vorherigen Fragment zurückkehren. Ich habe es auch nicht vollständig getestet, so dass es andere Probleme haben kann.

0
David Sucharda