私のアプリには、(ViewPagerIndicatorライブラリを使用して)4つのフラグメントを持つFragmentPagerAdapterを持つ単一のアクティビティがあります。これらのフラグメントの1つには、個別の縦向きと横向きのレイアウトの両方のデザインがあり、他の3つにはないため、縦向きに固定する必要があります。
私の考えは、マニフェストでAndroid:configChanges="orientation"
を設定し、すべてのフラグメントのgetActivity().setRequestedScreenOrientation()
でonResume()
を呼び出して、3つのフラグメントではSCREEN_ORIENTATION_PORTRAIT
にロックし、ローテーションを許可する必要があるものではSCREEN_ORIENTATION_UNSPECIFIED
にロックすることでした。 、しかしこれはうまくいきません。アプリはポートレートモードのままです。
これを達成する方法はありますか?
とにかくフラグメントの向きを変更することなく、実際のアクティビティが回転する必要はありません。横向きの場合はタブバーが非表示になるため、アクティビティが回転しても同様に問題ありません。
各フラグメントのsetUserVisibleHint()
をオーバーライドします。
肖像画では断片のみ:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
縦長/横長のフラグメント:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}
}
これにより、アクティビティ全体を1つのフラグメントで回転できますが、他のフラグメントでは縦向きに修正できます。
私のために働いた一つのことは単に置くことでした
_getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
_
各フラグメントのOnCreateView()
メソッドの上部。 _ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
_を適切な_SCREEN_ORIENTATION
_定数に置き換えます。
これを実行すると、ICSで完全に機能しました。イベントは、特定のアクティビティのマニフェストを調整する必要はありません。
問題は、configChanges
を有効にする場合、アクティビティ/フラグメントでonConfigurationChanged()
メソッドを処理する必要があることです。
つまり、getActivity().setRequestedScreenOrientation()
を実行した場合は、手動でsetContentView()
を再度呼び出して、ランドスケープレイアウトを再度インフレートする必要があります。
また、「UNSPECIFIED」を設定しても横向きに変更されず、そのままの場所にとどまります。
ポートレートのフラグメントにはgetActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)
を使用します。ランドスケープフラグメントの場合はgetActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)
です。
これにより、アクティビティレイアウトが再インフレートされます。つまり、レイアウトが再作成された後、デフォルトでそのフラグメントに戻る前に、最後のViewPagerページを追跡して、それらがユーザーとフラグメントonResume()
が呼び出されます。
厄介なことになるでしょうが、それは可能です。
特定のアクティビティタグのAndroidManifest.xml
にコードを記述します。
Android:configChanges="orientation|screenSize".
そしてonCreateView
メソッドにフラグメントでコードを書きます、
縦向きの場合:
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setRetainInstance(true);
横向き:
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRetainInstance(true);
設定するフラグメントで、onCreate
/onCreateView
に追加するだけです
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
あなたが多方向追加を許可したい他のフラグメントで
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);