web-dev-qa-db-ja.com

1つのフラグメントで回転/横向きを許可する

私のアプリには、(ViewPagerIndicatorライブラリを使用して)4つのフラグメントを持つFragmentPagerAdapterを持つ単一のアクティビティがあります。これらのフラグメントの1つには、個別の縦向きと横向きのレイアウトの両方のデザインがあり、他の3つにはないため、縦向きに固定する必要があります。

私の考えは、マニフェストでAndroid:configChanges="orientation"を設定し、すべてのフラグメントのgetActivity().setRequestedScreenOrientation()onResume()を呼び出して、3つのフラグメントではSCREEN_ORIENTATION_PORTRAITにロックし、ローテーションを許可する必要があるものではSCREEN_ORIENTATION_UNSPECIFIEDにロックすることでした。 、しかしこれはうまくいきません。アプリはポートレートモードのままです。

これを達成する方法はありますか?

とにかくフラグメントの向きを変更することなく、実際のアクティビティが回転する必要はありません。横向きの場合はタブバーが非表示になるため、アクティビティが回転しても同様に問題ありません。

27
Garcon

各フラグメントの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つのフラグメントで回転できますが、他のフラグメントでは縦向きに修正できます。

35
Garcon

私のために働いた一つのことは単に置くことでした

_getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
_

各フラグメントのOnCreateView()メソッドの上部。 _ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR_を適切な_SCREEN_ORIENTATION_定数に置き換えます。

これを実行すると、ICSで完全に機能しました。イベントは、特定のアクティビティのマニフェストを調整する必要はありません。

10
George Baker

問題は、configChangesを有効にする場合、アクティビティ/フラグメントでonConfigurationChanged()メソッドを処理する必要があることです。

つまり、getActivity().setRequestedScreenOrientation()を実行した場合は、手動でsetContentView()を再度呼び出して、ランドスケープレイアウトを再度インフレートする必要があります。

また、「UNSPECIFIED」を設定しても横向きに変更されず、そのままの場所にとどまります。

ポートレートのフラグメントにはgetActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)を使用します。ランドスケープフラグメントの場合はgetActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)です。

これにより、アクティビティレイアウトが再インフレートされます。つまり、レイアウトが再作成された後、デフォルトでそのフラグメントに戻る前に、最後のViewPagerページを追跡して、それらがユーザーとフラグメントonResume()が呼び出されます。

厄介なことになるでしょうが、それは可能です。

3
Chris.Jenkins

特定のアクティビティタグのAndroidManifest.xmlにコードを記述します。

Android:configChanges="orientation|screenSize".

そしてonCreateViewメソッドにフラグメントでコードを書きます、
縦向きの場合:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
setRetainInstance(true);

横向き:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRetainInstance(true);
0
Virendra Kachhi

設定するフラグメントで、onCreate/onCreateViewに追加するだけです

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

あなたが多方向追加を許可したい他のフラグメントで

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
0
ravid rinek