回答:
9行目のAndroidManifest.xml(link)を見てください。
<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">
この行では、screenOrientation
をランドスケープとして指定していますが、作成者はさらにを使用して画面の向きの変更をオーバーライドしますconfigChanges="orientation|keyboardHidden"
。これは、VncCanvasActivity.javaでオーバーライドされた関数を指します。
VncCanvasActivityを見ると、109行目がオーバーライドされた関数です。
@Override
public void onConfigurationChanged(Configuration newConfig) {
// ignore orientation/keyboard change
super.onConfigurationChanged(newConfig);
}
著者は特に、キーボードや向きの変更を無視するようにコメントを付けました。
これを変更する場合は、上記のAndroidManifest.xmlファイルに戻って、行を次のように変更できます。
<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">
これにより、ユーザーがデバイスを回転させると、プログラムが縦向きから横向きに切り替わります。
これは機能する可能性がありますが、レイアウトの作成方法によっては、GUIの外観が台無しになる可能性があります。あなたはそれを説明する必要があります。また、アクティビティのコーディング方法によっては、画面の向きを変更すると、入力ボックスに入力された値が消えることがあります。これも処理する必要があります。
If your application targets API level 13 or higher (as declared by the minSdkVersion and targetSdkVersion attributes), then you should also declare the "screenSize" configuration, because it also changes when a device switches between portrait and landscape orientations.
Javaコードでも同じデータを設定できます。
myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
ActivityInfoの他の値を使用すると、センサー駆動またはロックされた縦向きに設定できます。個人的には、この質問への別の回答で提案されているように、マニフェストで何かを設定し、必要に応じて、Android SDKの上記の呼び出しを使用して後で変更したいです。
If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
マニフェストでアクティビティの方向を指定できます。こちらをご覧ください。
<activity android:allowTaskReparenting=["true" | "false"]
...
android:screenOrientation=["unspecified" | "user" | "behind" |
"landscape" | "portrait" |
"sensor" | "nosensor"]
...
"adjustResize", "adjustPan"] >
すばやく簡単な解決策はAndroidManifest.xmlファイルです。ランドスケープモードに強制するアクティビティごとに、次を追加します。
android:screenOrientation="landscape"
アルスラーン、なぜマニフェストに方向性を強制したいのですか?
<activity android:name=".youractivityName" android:screenOrientation="portrait" />
コードでそれを行うのはIMOの誤りであり、それをonCreateに入れるとなおさらです。マニフェストでそれを行うと、「システム」はアプリの起動から方向を認識します。そして、このタイプのメタまたはトップレベルの「ガイダンス」はマニフェストに含める必要があります。自分でそれを証明したい場合は、アクティビティのonCreateにブレークを設定します。コードで実行すると、2回呼び出されます。ポートレートモードで起動してから、ランドスケープに切り替えます。マニフェストで行う場合、これは起こりません。
以下のためのアンドロイド4.0(アイスクリームサンドイッチ)以降、私はほかに、これらを追加するために必要なlandscape
値。
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
のみkeyboardHidden|orientation
を使用すると、メモリリークが発生し、電源ボタンを押したときにアクティビティが再作成されます。
orientation|screensize
ではすべてのケースで十分ではありませんでした。自動回転して縦向きに戻ります。
すべてのアクティビティに入力する必要があります
横向き
android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"
縦向き
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="org.thcb.app">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity2"
android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
configChanges
属性が必要なのですか?それがなくてもキーボード以外の電話で動作するようです...screenOrientation="landscape"
省略した場合、どのような状況で向きが縦向きに変わりますconfigChanges
か?