「ポートレート」方向モードを強制する


298

私のアプリケーションは完全に「横長」モード用に設計されていないため、アプリケーションに「縦長」モードを強制しようとしています。

いくつかのフォーラムを読んだ後、マニフェストファイルに次の行を追加しました。

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

しかし、私のデバイス(HTC Desire)では機能しません。マニフェストファイルの行を無視して、「portrait」または「landscape」から切り替えます。

さらにフォーラムを読んだ後、これをマニフェストファイルに追加しようとしました。

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

そして私の活動クラスのこの関数:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

しかし、再び、運はありません。

回答:


531

方向をアプリケーション要素に適用しないでください。代わりに、属性をアクティビティ要素に適用し、configChanges以下のように設定する必要があります。

例:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

これはマニフェストファイルに適用されますAndroidManifest.xml


26
configChangesは何のためのものですか?
Dror 2012年

71
@ Orchestrator、configChangesは、構成の変更がアクティビティ自体によって処理されることを意味します。これがないと、向きが変更された場合にアクティビティが再開されます。向きが「ポートレート」であると指定した場合、どのように変化するのでしょうか。方向を変更する別のアクティビティを起動すると、変更され、その新しいアクティビティが終了して、アクティビティに戻ります。たとえば、Samsung Galaxy S3のデフォルトの画像キャプチャインテントは、特定の方向でそれを行います。
Gordon McCreight

2
@GordonMcCreight、これを実際の例で説明できますか "向きが"縦向き "であると指定した場合、どのように変化するかを尋ねられますか?向きを変える別のアクティビティを起動すると、向きが変わる可能性があります。新しいアクティビティが終了し、アクティビティに戻ります。」
Tushar Pandey 2013

3
確かに、@ TusharPandey。私が正しく思い出すと、これが私たちの悲しみを引き起こした1つの場所は、私たちの活動がSamsung Galaxy S3でデフォルトの画像キャプチャインテントを開始したときでした。基本的に、写真を撮って結果を得たいだけでした。ただし、カメラのインテントが戻ると、向きを変更してアクティビティの状態を消去しました。これを防ぐ必要があるとは考えていなかったためです(アプリ全体が「縦向き」の向きしかなかった場合)。Galaxy S3がこれを行う方法と理由は、私の(確かに制限された)理解を超えています。
Gordon McCreight 2013

8
「keyboardHidden」が含まれているのはなぜですか?
ゴンゾブレーン2014年

24

ご了承ください

android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

アクティビティが定義されているマニフェストファイルに追加されます。


13

android:screenOrientation="portrait"個人の活動にも使えると思います。したがって、次の<activity>ようなタグでその属性を使用します。

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>

13

私のような多くのアクティビティをアプリケーションで行っている場合、またはマニフェストに各アクティビティタグのコードを入力したくない場合は、これを行うことができます。

Application Baseクラスでは、ライフサイクルコールバックを取得します

したがって、基本的に、アプリケーションクラスでon createを作成したときに各アクティビティで発生するのは、コードです。

public class MyApplication extends Application{

@Override
    public void onCreate() {
        super.onCreate();  

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

これがお役に立てば幸いです。


1
効率的な答え!これは、特に多数のアクティビティに大きく依存する複雑なアプリを開発している人にとっては正しい答えになるはずです。
FEBRYAN ASA PERDANA

10

セット力ポートレートや風景モード、それぞれの行を追加します。

以下の行をインポート

import android.content.pm.ActivityInfo;

すぐ上の行の下に追加 setContentView(R.layout.activity_main);

向きの場合

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

以下のためのLandscap

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

これは間違いなく動作します。


1
一部のデバイスのAndroid 9ではこれが失敗します。
ポートレートを

可能であれば、これに直面しているデバイス情報を指定してください
Parth Patel

4

Androidのドキュメントによると、多くの場合screenSize、可能な構成変更として含める必要があります。

android:configChanges="orientation|screenSize"

アプリケーションがAPIレベル13以上をターゲットにしている場合(minSdkVersionおよびtargetSdkVersion属性で宣言されているとおり)、 "screenSize"構成も宣言する必要があります。これは、デバイスが縦向きと横向きの間で切り替わるときにも変化するためです。

また、あなたはすべての値が含まれている場合keyboardHidden、あなたの例では、あなたはその後も検討するべきではありませんlocalemccfontScalekeyboard、その他?..


3

私のAndroidManifest.xmlにこの行がありました

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

私が変更したもの(追加したばかりandroid:screenOrientation="portrait"

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

これで解決しました。


2

補足するもの:私は最近アプリを更新しました、以前は横向きと縦向きの両方のモードで動作していました、そして更新されたバージョンが縦向きモードで動作するようにしたいので、私は追加しました

android:screenOrientation="portrait"

対応するアクティビティに、そして私がアップデートをテストしたときにクラッシュしました。次に追加しました

android:configChanges="orientation|keyboardHidden"

また、それは動作します。


1
これが質問に対する回答ではない場合、コメントが役立つので、それを追加することができます。
JPReddy 2014年

アプリケーションブロックではないアクティビティに追加したことを確認します
Waran-

1

android:configChanges="orientation|keyboardHidden"アクティビティに追加したいと思いますか?そうでない場合、アクティビティはconfig-changeで再開されます。onConfigurationChanged唯一、その後、呼び出されないでしょうonCreate


1

debugおよびreleaseビルドで異なる方向をサポートする場合は、そのように記述しますhttps://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifestを参照)。

ではbuild.gradle、あなたのappフォルダの書き込み:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

次に、AndroidManifestこの変数「orientation」を任意の場所で使用できますActivity

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

追加できandroid:configChangesます:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]デバッグ中およびmanifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]リリース中

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />

-8

短い答え:しないでください。

アプリを再設計して、縦向きモードと横向きモードの両方で実行できるようにします。縦向きと横向きの両方で機能するように設計できないUIなどはありません。怠惰なまたは想像力に欠ける開発者のみ。

理由はかなり単純です。アプリをできるだけ多くのユーザーができるだけ多くの異なるデバイスで使用できるようにしたいとします。特定の画面の向きを強制することで、その向きをサポートしていないデバイスでアプリが(通常は)実行されなくなり、別の向きを好む潜在的な顧客を苛立たせ、疎外します。

例:ポートレートモードを強制するようにアプリを設計します。顧客が主に横向きモードで使用する2-in-1デバイスにアプリをダウンロードします。
結果1:アプリが使用できない、または顧客がデバイスのドッキングを解除して回転させ、使い慣れていないまたは快適でない向きで使用することを余儀なくされた。
結果2:顧客は、アプリの直感的でないデザインに不満を感じ、別のアプリを見つけるか、アプリを完全に使い切ってしまいます。

私は今、アプリでこれと戦っています。消費者および開発者として、私はそれが嫌いです。アプリと同じくらい便利で、機能も素晴らしいので、デバイスを使用する他のすべての方法とは逆の向きを使用せざるを得ないので、アプリは絶対に嫌いです。

あなたの顧客にあなたのアプリを嫌ってほしくない。


これは直接質問の答えにはならないので、気になる人のためにもう少し詳しく説明したいと思います。

開発者はコードを書くのが本当に上手で、デザインが本当にひどい傾向があります。この質問はコードの質問のように聞こえますが、質問者は確かにコードの質問のように感じますが、実際には設計の質問です。

問題は、「アプリの画面の向きをロックする必要があるか」ということです。質問者は、縦長モードでのみ機能し見栄えがよくなるようにUIを設計することを選択しました。開発時間を節約するためか、アプリのワークフローが特に縦長のレイアウト(モバイルゲームでは一般的)につながるためだと思います。しかし、これらの理由は、適切な設計の動機となる実際の重要な要素をすべて無視しています。

  1. 顧客エンゲージメント-顧客にアプリから押し出されるのではなく、引き込まれていると感じてもらいたい。アプリは、お客様がアプリを開く前に行っていたことからスムーズに移行する必要があります。(これが、ほとんどのプラットフォームが一貫した設計原則を持っている理由です。そのため、ほとんどのアプリは、多かれ少なかれ、似ている必要はありませんが。)

  2. 顧客の反応-あなたの顧客があなたのアプリに積極的に反応することを望みます。彼らはそれを使うのを楽しむべきです。それが仕事用の給与計算アプリであっても、それを開いて出勤することは彼らにとって喜びであるはずです。このアプリは顧客の時間を節約し、他の選択肢に対する不満を減らします。(ユーザーを不快にさせるアプリは、あなたのブランドに対する憤慨へと成長するあなたのアプリに対する憤慨を構築します。)

  3. 顧客のコンバージョン-顧客がブラウジングから対話にすばやく簡単に移動できるようにしたいと考えています。これは、インプレッションを収益に変換する、あらゆるアプリの最終的な目標です。(収益を生み出さないアプリは、ビジネスの観点から、構築するのに時間の無駄です。)

UIが適切に設計されていないと、顧客のエンゲージメントと応答が減少し、最終的には収益が低下します。モバイル中心の世界(特に縦向き/横向きの表示モード)では、これがレスポンシブWebデザインが非常に重要である理由を説明しています。ウォルマートカナダは2013年11月にレスポンシブデザインをウェブサイトに導入し、顧客のコンバージョンが20%増加しました。オニール服は応答Webデザインと実装のiOSデバイスを使用して、顧客からの収益が増加101.25パーセントを、そして591.42パーセントの顧客からは、Androidデバイスを使用して

また、開発者は特定のソリューション(ディスプレイの向きのロックなど)の実装に集中する傾向があり、このサイトのほとんどの開発者は、それが最善であるかどうかを疑問視することなく、そのソリューションの実装を手伝うことはできません。問題の解決策。

画面の向きのロックは、do-whileループの実装と同等のUIデザインです。あなたは本当にあなたがそのようにやりたい、またはより良い代替手段があることを確認?

アプリを強制的に単一表示モードにしないでください。余分な時間と労力をかけて、応答性を高めます。


2
UIが適切に設計されていないことについて理解し、同意します。しかし、そうする必要があるかもしれないという事実は変わりませんが、それでも一般的にフレームワークにはそれらの機能が必要です。将来のアプリがどのようになるかわからないので、実行する必要があるので、質問はまだ有効です。
Z.クラ2017

1
あなたは間違っていません。私の答えの一部は、これを不必要に実行するいくつかのアプリで私が持っているフラストレーションによって部分的に燃料を供給されたと思います、そしてそれは経験を完全に台無しにします。表示モードをロックする正当なケースの数はごくわずかです(予算内ではなく、実行可能であり、望ましいです)。これは他の問題を思い起こさせます。コーディングが簡単になるにつれて、多くのアマチュア開発者がコードを知っているが、UIやデザインの方法、さらには基本的なベストプラクティス(\ AppData-EWWWWにインストールされるJavaアプリ)さえ学ばないため、アプリを作成している人がたくさんいます。
トーマス

1
VRアプリを作成しています。メガネが魔法をかけるには、向きが横向きでなければなりません。これは、縦向きと横向きの両方で機能するように設計できないUIの一例です。ゲームは、特定の方向を強制する必要がある場合もあります。正当な事件がたくさんあるに違いない。
Raslanove、2018年

1
StackExchangeは特定の質問に回答するために存在しますが、回答は他の人に役立つように、できるだけ一般的に適用されるように作成する必要があります。開発は単にコードを書くだけではなく、世界中に多くのジャンクアプリケーションが存在する理由は、非常に多くの開発者がこの重要な原則を忘れている、またはまったく知らないためです。個人的には、VRをスマートフォンで実行している場合、VRを間違っていると個人的に付け加えますが、コストが原因で、VRのサポートを必要としないプラットフォームにVRの需要が高まっています。
トーマス

1
私はこの答えに同意しませんが、それは尋ねられなかった質問に答えることです。
bmovement
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.