android - 画面 - 強制的に「ポートレート」方向モード




スマホ 縦 固定 html (7)

自分のアプリケーションが「ランドスケープ」モード用に設計されていないため、アプリケーション用に「ポートレート」モードを強制しようとしています。

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

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

しかし、私のデバイス(HTC Desire)では動作しません。 マニフェストファイルの行を無視して、 "portrait" lo "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);
}

しかし、再び、運がない。


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"追加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">

これは私のために固定されたものです。


Androidのドキュメントによれば、 screenSizeを構成変更の可能性として含めることもしばしばあります。

android:configChanges="orientation|screenSize"

アプリケーションがAPIレベル13以上(minSdkVersionおよびtargetSdkVersion属性で宣言されている)をターゲットにしている場合は、デバイスがポートレートとランドスケープの向きを切り替えるときにも変更されるため、「screenSize」設定も宣言する必要があります。

また、すべてあなたの例で値keyboardHiddenを含む場合は、 localemccfontScalekeyboardなどを考慮してはいけませんか?


フォースモードまたは風景モードを設定し 、それぞれラインを追加します。

下にインポート

import android.content.pm.ActivityInfo;

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

ポートレートの場合

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

ランドスケープの場合

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

これは間違いなく機能します。


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

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) {

            }
        });
}

私はこれが役立つことを願っています


何かを補完する:私は最近、アプリを更新しました。以前は風景モードとポートレートモードの両方で作業していました。更新されたバージョンをポートレートモードで動作させたいので、追加しました

android:screenOrientation="portrait"

対応するアクティビティに移動し、アップデートをテストしたときにクラッシュしました。 それから私は

android:configChanges="orientation|keyboardHidden"

あまりにも、それは動作します。


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

ポートレートモードとランドスケープモードの両方で実行できるようにアプリケーションを再設計します。 ポートレートとランドスケープの両方で動作するように設計できないUIのようなものはありません。 怠惰なまたは想像力のない開発者だけです。

理由はかなり単純です。 できるだけ多くの異なるデバイスで幅広い視聴者がアプリを使用できるようにしたいと考えています。 特定の画面の向きを強制することで、その向きをサポートしていないデバイスでアプリが実行されるのを防ぐことができます。異なる向きを希望する潜在的な顧客を苛立たさせたり離れたりすることはありません。

例:ポートレートモードを強制するようにアプリを設計します。 顧客は、主にランドスケープモードで使用する2-in-1デバイスでアプリをダウンロードします。
結果1:あなたのアプリを使用できない、またはお客様のデバイスのドッキングを解除して回転させ、使い慣れていない、または快適でない方向で使用することが強制されます。
結果2:顧客はあなたのアプリの直感的ではないデザインによって挫折し、代替案を見つけたり、アプリを完全に捨てたりする。

私は今これでアプリと一緒に戦い、消費者と開発者として、私はそれが嫌いです。 アプリとして役立つように、それが提供する機能と同じくらい幻想的なので、私は自分のデバイスを使用するあらゆる方法とは逆の方向を使うように強制するので、絶対に嫌いです。

あなたの顧客があなたのアプリを嫌うことは望ましくありません。

私はこれが直接質問に答えるものではないことを知っているので、私は好奇心を持っている人のためにもう少し詳しく説明したいと思います。

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

本当に問題は「アプリで画面の向きを固定する必要がありますか?」です 質問者は機能するようにUIをデザインし、ポートレートモードでしか見えないようにすることを選択しました。 私はそれが開発時間を節約することだったと思うか、アプリのワークフローが特にポートレートレイアウト(モバイルゲームに共通)に役立つからです。 しかし、これらの理由は、適切な設計を促す重要な要素をすべて無視してしまいます。

  1. 顧客のエンゲージメント - あなたの顧客があなたのアプリにプルされているのではなく、プルされたと感じることを望みます。 アプリを開く前に、顧客が行っていたことからスムーズに移行する必要があります。 (これは、ほとんどのプラットフォームが一貫した設計原則を持っている理由であるため、ほとんどのアプリはそれほど似通っていないように見えます)。

  2. 顧客の反応 - 顧客があなたのアプリに積極的に反応するようにします。 彼らはそれを楽しむべきです。 たとえそれが仕事のための給与アプリであっても、それを開いて時計を入れるのは楽しいことです。アプリはあなたの顧客の時間を節約し、代替案に対する不満を減らすはずです。 (ユーザーがあなたのアプリに対する憤慨を募らせてブランドに憤慨するアプリ)

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

UIがうまく設計されていないと、顧客の関与と対応が低下し、最終的に収益が低下します。 モバイルセントリックな世界(特にポートレート/風景表示モードのテーマ)では、これはなぜ敏感なウェブデザインが大きな問題であるかを説明しています。 ウォルマート・カナダは、2013年11月にウェブサイトで反応性の高いデザインを導入し、顧客のコンバージョン率を20%増加させました。 O'Neillの服は応答性の高いウェブデザインを実装し、iOSデバイスを使用している顧客からの収益は、Androidデバイスを使用する顧客から101.25%591.42%増加しました

開発者は特定のソリューション(ディスプレイの向きを固定するなど)の実装に熱心に取り組む傾向もあり、このサイトの開発者のほとんどは、そのソリューションの実装を手助けするにはあまりにも喜んでいます。問題の解決策。

画面の向きをロックすることは、do-whileループを実装するのと同じUI設計です。 あなたは本当にそれをやりたいと思っていますか、それともより良い選択肢がありますか?

アプリを強制的に1つの表示モードにしないでください。 それを反応させるために余分な時間と労力を投資してください。


私はandroid:screenOrientation="portrait"は個々の活動に使用できると思います。 したがって、 <activity>タグでその属性を使用してください:

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




portrait