web-dev-qa-db-ja.com

アクティビティが1つのフラグメントのみの向きを設定し、残りがポートレートになっている

私のアプリはポートレートモードにする必要があるため、次の方法でマニフェストに設定します。

Android:screenOrientation="portrait"

しかし、私は最近、もう1つのフラグメント(FragA)を追加しました。 FragAの内部に置いて、フラグメントを横向きにして、アプリの残りの部分をポートレートに保持できるものはありますか?これにより、他のフラグメントに何かを追加して、ポートレートとして保持する必要がありますか?

36
John Ubonty

方向属性はアクティビティごとに設定されるため、フラグメントを含むアクティビティのみの方向を宣言して、フラグメントが横向きになり、残りのアクティビティがそのまま残るようにすることができます。

13
Dinesh Venkata

特定の(この場合は縦長の)向きにするフラグメントで、次のコード行を使用します。

getActivity().setRequestedOrientation(
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

ユーザーがデバイスを保持する方法に基づいて、フラグメントに方向を設定する場合は、次のコード行を使用します。

getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

これで目的のソリューションが得られることを願っています。

89
pradeep.k

各フラグメントで、要求された方向を設定します。

リファレンスドキュメント: 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);
}
17
Philip Herbert

フラグメント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メソッドコードにより、アクティビティが縦向きに戻ることが保証されます

0

だから私は今この問題に取り組んでいます。 portrait mode application(今のところ)しかありません。しかし、landscapeにある必要があるフラグメントが1つあります。単一のアクティビティアプローチを使用しているため、受け入れられた答えが役に立たない。

私が考えることができる最速の解決策はこれです。

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
}

swappingOrientation変数で方向を交換するかどうかに関係なく、情報を保持します。フラグメントが作成される最初の時点で、保存された状態がない場合にのみ、フラグメントは方向を変更します。また、現在変更されていない場合にのみ、方向が元に戻ります。

これは非常に迅速なソリューションであり、前のフラグメントに戻ると画面が点滅する場合があります。また、他の問題が発生する可能性があるため、完全にはテストしていませんので、注意してください。

0
David Sucharda