質問

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

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

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

しかし、それは私のデバイスでは機能しません(HTC Desire)。マニフェストファイルからの行を無視して、「ポートレート」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);
}

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

役に立ちましたか?

解決

オリエンテーションをに適用しないでください 応用 要素、代わりに、属性をに適用する必要があります アクティビティ 要素、そしてあなたも設定する必要があります configChanges 以下に示すように。

例:

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

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

他のヒント

ご了承ください

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

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

おもう android:screenOrientation="portrait" 個々の活動に使用できます。したがって、その属性を使用してください <activity> のようなタグ:

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

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

アプリケーションベースクラスでは、ライフサイクルコールバックが表示されます

したがって、基本的に、アプリケーションの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) {

            }
        });
}

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

設定 フォースポートレートまたはランドスケープモード, 、それぞれ行を追加します。

輸入 下の行:

import android.content.pm.ActivityInfo;

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

為に 肖像画:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

為に 風景:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

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

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

android:configChanges="orientation|screenSize"

アプリケーションがAPIレベル13以降をターゲットにしている場合(MinSdKversionおよびTargetSdkversion属性によって宣言されているように)、デバイスがポートレートとランドスケープの向きを切り替えると変更されるため、「スクリーン化」構成も宣言する必要があります。

また、すべての価値が含まれている場合 keyboardHidden あなたの例では、あなたも考慮すべきではありません locale, mcc, fontScale, keyboard その他?..

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

これは私にとって固定されたものです。

補完するもの:最近アプリを更新しましたが、以前はランドスケープモードとポートレートモードの両方で機能していました。更新されたバージョンがポートレートモードで動作する必要があるので、追加しました。

android:screenOrientation="portrait"

対応するアクティビティに、更新をテストしたときにクラッシュしました。その後、追加しました

android:configChanges="orientation|keyboardHidden"

また、それは機能します。

追加したいと思います android:configChanges="orientation|keyboardHidden" あなたの活動に?それ以外の場合、アクティビティは構成チェンジで再起動されます。 onConfigurationChanged その後、と呼ばれません onCreate

さまざまなオリエンテーションをサポートしたい場合 debugrelease ビルド、そのように書く(参照 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 この変数「方向」を使用することができます 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}" />

簡潔な答え: それをしないでください。

アプリがポートレートモードとランドスケープモードの両方で実行できるように、アプリを再設計します。肖像画と風景の両方で機能するように設計できないUIのようなものはありません。怠zyまたは想像を絶する開発者のみ。

理由はかなり単純です。可能な限り多くの異なるデバイスで、できるだけ多くのオーディエンスでアプリを使用できるようにします。特定のスクリーンオリエンテーションを強制することにより、その方向性をサポートせず、異なるオリエンテーションを好む潜在的な顧客をイライラさせ、疎外するデバイスでアプリを(使用可能に)実行しないようにします。

例:アプリを設計してポートレートモードを強制します。顧客は、ランドスケープモードで主に使用する2-in-1デバイスにアプリをダウンロードします。
結果1:アプリが使用できないか、顧客がデバイスを解き、回転させ、馴染みのない、または快適ではないオリエンテーションで使用することを余儀なくされます。
結果2:顧客は、アプリの直感的でないデザインに不満を感じ、代替品を見つけたり、アプリを完全に捨てたりします。

私は今、アプリでこれと戦っています。消費者であり開発者として、私はそれが嫌いです。アプリと同じくらい便利であり、機能が提供する機能と同じくらい素晴らしいですが、アプリは、デバイスを使用する他のあらゆる方法にカウンターであるオリエンテーションを使用することを強制するため、アプリを絶対に嫌います。

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


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

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

問題は、「アプリの画面の向きをロックする必要がある」ということです。 Askerは、Portrait Modeでのみ機能し、見栄えを良くするためにUIを設計することを選択しました。開発時間を節約すること、またはアプリのワークフローがポートレートレイアウト(モバイルゲームに共通)を特に助長するためだったと思います。しかし、これらの理由は、適切な設計を動機付けるすべての実際の重要な要因を無視しています。

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

  2. 顧客の対応 - 顧客にアプリに積極的に反応することを望みます。彼らはそれを使うことを楽しむべきです。仕事の給与アプリであっても、彼らがそれを開いて時計を入れることは喜びであるはずです。アプリは顧客の時間を節約し、代替に対するフラストレーションを減らす必要があります。 (ユーザーを悩ますアプリは、あなたのブランドに対するresりに成長するアプリに対するresみを築きます。)

  3. 顧客の変換 - 顧客が閲覧から相互作用へと迅速かつ簡単に移動できるようにすることを望みます。これは、インプレッションを収益に変換するためのアプリの究極の目標です。 (収益を生み出さないアプリは、ビジネスの観点から、構築する時間の無駄です。)

不十分に設計されたUIは、顧客のエンゲージメントと対応を減らし、最終的に収益を減らします。モバイル中心の世界(特にポートレート/ランドスケープディスプレイモードのテーマに関する)では、レスポンシブWebデザインが非常に重要な理由を説明しています。 Walmart Canadaは2013年11月にウェブサイトにレスポンシブデザインを導入し、 20% 顧客変換の増加。 O'Neill Clothingは、レスポンシブWebデザインを実装しました iOSデバイスを使用している顧客からの収益は増加しました 101.25%, 、 と 591.42% Androidデバイスを使用している顧客から.

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top