アプリをポートレートモードにする必要があるため、次の方法でマニフェストに設定します。
android:screenOrientation="portrait"
しかし、最近、ランドスケープで10倍優れた外観と機能を備えた別のフラグメント(FragA)を追加しました。FragAの内部に配置して、アプリの残りの部分を縦向きに保ちながら横向きにそのフラグメントを作成できるものはありますか?これを行うことで、他のフラグメントに何かを追加して、縦向きに保持する必要がありますか?
アプリをポートレートモードにする必要があるため、次の方法でマニフェストに設定します。
android:screenOrientation="portrait"
しかし、最近、ランドスケープで10倍優れた外観と機能を備えた別のフラグメント(FragA)を追加しました。FragAの内部に配置して、アプリの残りの部分を縦向きに保ちながら横向きにそのフラグメントを作成できるものはありますか?これを行うことで、他のフラグメントに何かを追加して、縦向きに保持する必要がありますか?
特定の(この場合は縦向きの)向きが必要なフラグメントで、次のコード行を使用します。
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
ユーザーがデバイスを保持する方法に基づいてフラグメントの方向を設定する場合は、次のコード行を使用します。
getActivity().setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
うまくいけば、これはあなたに意図された解決策を与えるでしょう。
各フラグメントで、要求された方向を設定します。
リファレンスドキュメント: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);
}
方向属性はアクティビティごとであるため、フラグメントを含むアクティビティのみの方向を宣言して、それが横向きになり、残りのアクティビティがそのまま残るようにすることができます。
だから私は今この問題に取り組んでいます。ポートレートモードのアプリケーションしかありません(今のところ)。しかし、横向きにする必要があるフラグメントが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変数に情報を保持します。フラグメントが作成された最初の時点で、保存された状態がない場合にのみ、方向が変更されます。また、現在変更されていない場合にのみ、向きが再び変更されます。
これは非常に迅速な解決策であり、前のフラグメントに戻ったときに画面が点滅する可能性があります。また、他の問題が発生する可能性があるため、十分にテストしていません。そのことを覚えておいてください。
最初のフラグメント:
@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);
}
これは古い質問ですが、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);
}
次に、ランドスケープモードで起動するフラグメントのいずれかからこれを実行しますextend
。LandscapeFragment
私がほとんど頭を吹き飛ばした後、これはジェットパックナビゲーションコンポーネントのフラグメントで私のために働いた
つまり、これは基本フラグメントクラスです
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()
}
フラグメント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メソッドコードにより、アクティビティを縦向きに戻すことができます