Androidアクティビティで常に横向きモードを使用するように強制する


144

HTC G1で Android VNCビューアを使用しています。しかし、何らかの理由で、G1が縦向きモードであっても、そのアプリケーションは常に横向きモードです。Android VNCビューアはオープンソースであるため、アクティビティを「横長」にハードコードする方法を教えてください。電話の向きを尊重するように変更したいと思います。

回答:


188

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の外観が台無しになる可能性があります。あなたはそれを説明する必要があります。また、アクティビティのコーディング方法によっては、画面の向きを変更すると、入力ボックスに入力された値が消えることがあります。これも処理する必要があります。


3
なぜ正確にconfigChanges属性が必要なのですか?それがなくてもキーボード以外の電話で動作するようです... screenOrientation="landscape"省略した場合、どのような状況で向きが縦向きに変わりますconfigChangesか?
Timmmm 2012年


システムイメージ選択ライブラリなどの組み込みアクティビティを横向きのみまたは縦向きのみに強制する方法
ジャッキー

118

Javaコードでも同じデータを設定できます。

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ActivityInfoの他の値を使用すると、センサー駆動またはロックされた縦向きに設定できます。個人的には、この質問への別の回答で提案されているように、マニフェストで何かを設定し、必要に応じて、Android SDKの上記の呼び出しを使用して後で変更したいです。


@Yegor常にではありません。Android docsから: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)
Chaitanya

40

私ではOnCreate(Bundle)、一般的に次のことを行います。

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
他の回答のマニフェストメソッドは機能していないようですが、@ anwarmaは有効でした
Anup

31

マニフェストでアクティビティの方向を指定できます。こちらをご覧ください

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  

24

マニフェストでは:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

あなたの活動では:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);

11

以下は、すべてのアクティビティを横長モードで表示するために使用したコードです。

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>

2
"orientation"アプリケーションがAPIレベル13以上をターゲットにしている場合は、 "screenSize"も宣言する必要があります
Mina

7

すばやく簡単な解決策はAndroidManifest.xmlファイルです。ランドスケープモードに強制するアクティビティごとに、次を追加します。

android:screenOrientation="landscape"

5

これはXamarin.Androidで機能します。OnCreate()内

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

4

それでおしまい!!この修正を長い間待っています。

Androidの古い問題で、(プログラムで)横向きモードを必要とするアクティビティを2回開始します。 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Androidは、最初にランドスケープモードを作成します。


3

アルスラーン、なぜマニフェストに方向性を強制したいのですか? <activity android:name=".youractivityName" android:screenOrientation="portrait" />


質問者ではありませんが、特定の時間に強制したいので、プログラムで強制したいのではないでしょうか。
Hamzah Malik 2014

1

コードでそれを行うのはIMOの誤りであり、それをonCreateに入れるとなおさらです。マニフェストでそれを行うと、「システム」はアプリの起動から方向を認識します。そして、このタイプのメタまたはトップレベルの「ガイダンス」はマニフェストに含める必要があります。自分でそれを証明したい場合は、アクティビティのonCreateにブレークを設定します。コードで実行すると、2回呼び出されます。ポートレートモードで起動してから、ランドスケープに切り替えます。マニフェストで行う場合、これは起こりません。


1
同意しません。マニフェストを介するのではなく、コードで何かを行うことは、常に私が好む方法です。単一の責任の原則に基づいて、マニフェストはアプリケーションレベルのプロパティ、権限、およびAPIバインディングのみに関係する必要があります。<activity>タグがアプリケーションマニフェストにまったく存在しないことに実際に同意していないため、そこに配置することはありません(正常に機能します)。アクティビティがどのように提示されるかは、明らかにプレゼンテーションの問題です。アクティビティは、それがどのように表示されるかについて単独で責任を負う必要があるため、通常、すべてのプレゼンテーションロジックをビュー/アクティビティコードに含めます。
ComeIn

0

以下のためのアンドロイド4.0(アイスクリームサンドイッチ)以降、私はほかに、これらを追加するために必要なlandscape値。

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

のみkeyboardHidden|orientationを使用すると、メモリリークが発生し、電源ボタンを押したときにアクティビティが再作成されます。


悪い練習警告!これは、ランドスケープモードでのアクティビティの強制とは関係ありません。あなたはいつもあなたの活動の状態の保存と再現を実装する必要があります。これが基本的なAndroid開発の知識です。このハッキーな修正でそれを解決しないでください。より多くのメモリが必要な場合、アクティビティは常にシステムによって閉じられます。
Roel

@Roel、それは、たとえばデバイスを回転させたときに、アクティビティが回転して縦向きに戻るのを防ぐ唯一の方法です。これらの構成変更がアクティビティに影響するのを防ぎます。
Peterdk 2017年

少し不機嫌そうなメッセージで申し訳ありませんが、私はそれをテストしました。ランドスケープモードではこれらすべての値を使用するわけではありません。これらのすべての値を追加すると、アクティビティが単に再起動されるのではなく、onConfigurationChanged()で変更を処理することになります(そのため、実装する必要があります)。しかし、ランドスケープを強制した場合、ローテーションは行われません。
Roel

こんにちは、それらのいくつかはおそらく必要ないかもしれませんが、それらのすべてを省略すると奇妙なローテーションの問題が発生します。今はテストできませんが、常に横向きにする必要があるアプリを開発しているときは、使用するだけorientation|screensizeではすべてのケースで十分ではありませんでした。自動回転して縦向きに戻ります。
Peterdk 2017年

これらの構成変更は、Googleモバイル広告やその他のAd SDKでも使用されます。それは私が当時彼らから得たものです。
Peterdk 2017年

0

このようにsetLayoutメソッドを呼び出す前に、onCreateメソッドでActivityInfo(android.content.pm.ActivityInfo)を使用します

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


0

アクティビティに次の行を追加します

すべてのアクティビティに入力する必要があります

横向き

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

縦向き

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

ここでMainActivityの例

<?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>

-25

を押しCTRL+F11て画面を回転させます。


3
彼らは今、画面の回転方法ではなく、アプリのデフォルトの向きをどのように設定するかを望んでいます。
kyle k

エミュレーターのCTRL + F12。
Lazy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.