57

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

android:screenOrientation="portrait"

しかし、最近、ランドスケープで10倍優れた外観と機能を備えた別のフラグメント(FragA)を追加しました。FragAの内部に配置して、アプリの残りの部分を縦向きに保ちながら横向きにそのフラグメントを作成できるものはありますか?これを行うことで、他のフラグメントに何かを追加して、縦向きに保持する必要がありますか?

4

8 に答える 8

111

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

getActivity().setRequestedOrientation(
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

getActivity().setRequestedOrientation(
                ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

うまくいけば、これはあなたに意図された解決策を与えるでしょう。

于 2013-10-15T15:21:27.217 に答える
23

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

リファレンスドキュメント: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);
}
于 2015-09-05T20:04:26.107 に答える
13

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

于 2012-10-03T07:45:59.100 に答える
4

だから私は今この問題に取り組んでいます。ポートレートモードのアプリケーションしかありません(今のところ)。しかし、横向きにする必要があるフラグメントが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変数に情報を保持します。フラグメントが作成された最初の時点で、保存された状態がない場合にのみ、方向が変更されます。また、現在変更されていない場合にのみ、向きが再び変更されます。

これは非常に迅速な解決策であり、前のフラグメントに戻ったときに画面が点滅する可能性があります。また、他の問題が発生する可能性があるため、十分にテストしていません。そのことを覚えておいてください。

于 2019-02-11T16:40:36.320 に答える
2

最初のフラグメント:

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

    }

2番目のフラグメント:

     @Override
        public void onResume() {
            super.onResume();
 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
   }
于 2019-09-17T16:28:54.000 に答える
1

これは古い質問ですが、OPが必要とするソリューションが必要な場合に備えて、これに答えます。これを実現する簡単な方法は次のとおりです。

public class LandscapeFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

       getActivity().setRequestedOrientation(
              ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }

   @Override
   public View onDestroyView() {
       super.onDestroyView();

       getActivity().setRequestedOrientation(
             ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

次に、ランドスケープモードで起動するフラグメントのいずれかからこれを実行しますextendLandscapeFragment

于 2019-10-01T17:12:01.063 に答える
0

私がほとんど頭を吹き飛ばした後、これはジェットパックナビゲーションコンポーネントのフラグメントで私のために働いた

つまり、これは基本フラグメントクラスです

abstract class BaseFragment : Fragment(){   

var rotated = false

fun rotate() {
        val currentOrientation = activity?.resources?.configuration?.orientation //this is diffrent from  Configuration.ORIENTATION_LANDSCAPE
        Log.e("currentOrientation--->",currentOrientation.toString())

        if (currentOrientation != null) {
            if (currentOrientation !=  Configuration.ORIENTATION_LANDSCAPE) {
                activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
            }else{
                rotated=true
            }
        }else{
            //impossible
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
        }
    }


    override fun onDestroyView() {
        super.onDestroyView()
        if (rotated)
            activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
    }

}

そして私はこれを任意のフラグメントに入れます私はそれが造園されることを望みます

override fun onStart() {
    super.onStart()
    rotate()
}
于 2020-01-01T12:06:49.007 に答える
-1

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

于 2018-09-17T05:42:00.433 に答える