アプリでフラグメントを使用しています。ほとんどのフラグメントは、portaitという1つの方向のみを持つ必要があります。そのため、所有者のアクティビティを常にポートレートモードにするように強制しました。
しかし、私のフラグメントの1つには、ポートレートモードとランドスケープモードの両方が必要です。1つのフラグメントのみの方向変更を有効にするにはどうすればよいですか?または、他のフラグメントに依存せずに方向を処理するために、別のアクティビティにする必要がありますか?
アプリでフラグメントを使用しています。ほとんどのフラグメントは、portaitという1つの方向のみを持つ必要があります。そのため、所有者のアクティビティを常にポートレートモードにするように強制しました。
しかし、私のフラグメントの1つには、ポートレートモードとランドスケープモードの両方が必要です。1つのフラグメントのみの方向変更を有効にするにはどうすればよいですか?または、他のフラグメントに依存せずに方向を処理するために、別のアクティビティにする必要がありますか?
手動で行う必要があります。
1)この行をアクティビティタグandroid:configChanges = "orientation|screenSize"に追加します
2)fragmtnまたはactivityのconfigchangeコールバックをオーバーライドします
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
//Your fragment animation layout changing code
}
私はこれが古いことを知っていますが、それがまだ現在の問題であるため、誰かを助ける場合に備えて、2セントを追加します。
注:この回答は、26未満のAPIで問題を検出したため、投稿した1日後に編集されました。徹底的なテストの後、以下が私の最終的な回答です。このソリューションは、API 21以降で機能(テスト済み)します。
私のケースは投稿された質問と同じではないかもしれないので、私が持っているものとそれをどのように解決したかを指定します。
持っているすべてのフラグメントで、をオーバーライドする必要がありますonResume()
。その中で、「強制」する方向を指定します。
私の場合、縦向きと横向きで表示するフラグメントを1つだけにしたいので、設定しrequestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
ました(これは、設定されていない場合のデフォルト値です)が、残りのフラグメントで変更するためrequestedOrientation
、設定する必要があります。ここでも:
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
//The rest of your code (if you have something else here).
}
残りのフラグメントでは、縦向きを「強制」したかったので、次を使用しました。
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
//The rest of your code (if you have something else here).
}
それを機能させるために必要なのはそれだけです!以下はオプションですが、私にとっては便利かもしれません。
オプション1:
onResume()
フラグメントが多数あり、それぞれに変更/追加したくない場合は、オーバーライドするだけのサブクラス(PortraitFragmentなど)を作成できます。次に、この機能を持たせたいすべてのフラグメントをそこから導き出すことができます。Fragment()
onResume()
open class PortraitFragment : Fragment() {
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}
オプション2:
レイアウトによっては、これを追加することもできます。レイアウトがマルチウィンドウモード
用に準備されていないため、これを使用します。
マニフェストに追加android:resizeableActivity="false"
:
<activity android:name=".MainActivity"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustPan"
android:resizeableActivity="false">
私はこの問題の解決策を見つけました:
各フラグメントのsetUserVisibleHint()をオーバーライドします。
肖像画では断片のみ:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
Activity a = getActivity();
if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
setRequestedOrientation
表示するフラグメントを選択するときは、Activityメソッドを使用します。
public class MyActivity extends Activity {
// ...
public void chooseFragment(int x) {
Fragment newFragment;
if (x == 1) {
// FragmentOne can be any orientation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
newFragment = new FragmentOne();
}
else {
// FragmentTwo can be only portrait orientation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
newFragment = new FragmentTwo();
}
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, newFragment)
.commit();
}
// ...
}
AndroidManifest.xmlで、フラグメントにandroid:screenOrientation = "portrait"を追加します。uはPortraitとして修正し、方向を修正したくないフラグメントにはこのステートメントを追加しないでください。例:
<activity
android:name="com.example.myapp.MainActivity"
android:screenOrientation="portrait"/>