向きが変わってもアプリケーションをリロードしないでください


152

画面が回転しても、何も変更する必要はありません。アプリが最初に読み込まれたときにランダムな画像が表示され、デバイスを回転しても別のランダムな画像が選択されないはずです。この動作を停止する方法を教えてください。


1
コードから画面の向きをロック(場合によってはロック解除)することもできます。github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/…Screen.lockOrientation(this)から呼び出してください。マニフェストではできないロックを解除できます。
15年

@Escobar Ceaserこの質問の適切な解決策は何ですか。同じ要件があります。
Prabs 2015

これをプログラムでコードで実行したいと思います。
pollaris 2017

回答:


249

これを行うには、一般に3つの方法があります。

  1. いくつかの回答が示唆しているように、初めて作成されたアクティビティとから復元されたアクティビティのケースを区別できますsavedInstanceState。これはonSaveInstanceState、のパラメータをオーバーライドしてチェックすることによって行われますonCreate

  2. マニフェストにを追加android:screenOrientation="portrait"(または"landscape")することで、アクティビティを1つの方向にロックでき<activity>ます。

  3. あなたが指定することによって、自分の画面変更を処理するためのものというシステムを言うことができるandroid:configChanges="orientation|screenSize"<activity>タグ。このようにして、アクティビティは再作成されませんが、代わりにコールバックを受け取ります(役に立たないため無視できます)。

個人的には(3)を使用します。もちろん、アプリをいずれかの方向にロックして問題がなければ、(2)を使用することもできます。


13
それで#3については、その行をマニフェストに追加するだけでいいと言っていますか?動かないから。
ジミーD

2
上の#3してくださいチェックstackoverflow.com/questions/456211/...

16
@ EscobarCeaser、Android 3.2以降の場合、次が必要ですandroid:configChanges="orientation|screenSize"
Pacerier 2014年

9
android:configChanges="orientation|screenSize"私のために働く。ありがとう、@ Pacerier
Don Larynx

1
android:configChanges="orientation|screenSize"多くの人があなたの答えをメインと見なしているので、API> = 13の値で回答ケース#3を更新してください!
radistao

215

Xionの答えは近いものでしたがandroid:configChanes="orientation"、アプリケーションのAPIレベルが12以下でなければ、#3()は機能しません。

APIレベル13以降では、向きが変わると画面サイズが変わるため、向きが変わると、アクティビティが破棄されて開始されます。

以下のように「screenSize」属性を追加するだけです。

<activity
    android:name=".YourActivityName"
    android:configChanges="orientation|screenSize">
</activity>

これで、向きを変更すると(そして画面サイズが変更されても)、アクティビティはその状態を維持し、 onConfigurationChanged()呼び出されます。これにより、向きが変わっても、画面上にあるもの(つまり、WebビューのWebページ)が保持されます。

このサイトからこれを学びました: http //developer.android.com/guide/topics/manifest/activity-element.html

また、これは明らかに悪い習慣であるため、ランタイムの変更の処理に関する以下のリンクをお読みください。

http://developer.android.com/guide/topics/resources/runtime-changes.html


2
ありがとう...「orientation」で「screenSize」を追加した後の作業
Pratik Butani

Samsung Galaxy Nexus android 4.2.1で動作します!android:configChanges="orientation|screenSize"
Vincent Ducastel 2014年

すごい。アクティビティのリロードと最初からのビデオに関する問題を解決するために、何時間もコードに取り組んできました。そしてここに解決策がありました!++++ 1
マティアスアスバーグ、2014年

6
悪い練習?実のところ、現実の人々には期限があり、それがうまくいけばうまくいく;)
Kacy

これが悪い習慣であるなら、なぜそれがそれほど多くの賛成票を得たのですか?
シャープエッジ

26

あなただけの中に移動するAndroidManifest.xml必要がありますまたはあなたの活動のラベルで、そこに誰かが言ったようにあなたはこのコード行を入力する必要があります:

android:configChanges="orientation|screenSize"

したがって、次のようなものになります。

<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>

うまくいきますように!


それは私のレイアウト-ランドレイアウトをロードしていません。:(うまく
いき

16
<activity android:name="com.example.abc" 
 android:configChanges="orientation|screenSize"></activity>

追加するだけ android:configChanges="orientation|screenSize"マニフェストファイルのアクティビティタブにです。

そのため、向きが変わってもアクティビティは再開されません。


その働き。しかし、それぞれの方向についてlayout.xmlとlayout-land.xmlに個別のレイアウトを使用している場合。両方の向きに適用する横向きのレイアウト。「オリエンテーション」のみを使用すると、期待どおりの結果が得られますが、リロードされます。これについて助けてもらえますか?
Karthikeyan Ve

1
@KarthikeyanVeそれはあなたがカンニングしようとしているときの問題です。レイアウトを変更するには、アクティビティを再開する必要があります。では、実際のソリューションであるとを使用onSaveInstanceState()してくださいonCreate()
Marc Plano-Lesay 2015

@ MarcPlano-Lesayと私はそれをどのように行うと思いますか?
Ahsan

:@Weaboo実際の解決策は、問題にリンクされているdeveloper.android.com/guide/topics/resources/...
マルク・プラノ・Lesay

@ MarcPlano-Lesay縦向きモードと横向きモードのレイアウトを分けました。横向きモードまたは縦向きモードでアプリを開くと正常に動作しますが、実行時に向きを変更しようとするとアプリが閉じますが、アプリにログインするとMainActivityに移動して方向を変更しようとすると、そのアクティビティがリロードされて正常に動作します。今問題はなぜですか?コードに論理エラーはありますか?Idkですが、アプリを何度かデバッグしようとしましたが、何も見つかりません。さらに、アクティビティを再開したくないのですが、構成が変更されるたびにそれぞれのレイアウトを調整できないのはなぜですか?
Ahsan

10

デフォルトではない動作を実行するよりも、向きの変更を適切に処理する方が実際に優れているのは、私の経験です。

現在表示されている画像を保存し、onSaveInstanceState()アプリケーションがonCreate()再度実行されるときに適切に復元する必要があります。


#3は完全に有効なソリューションです。これは、この正確な問題を解決するために作られた正確なツールです。どうして靴底が悪いと言うのですか?
Pacerier 2014年

1
@Pacerierただドキュメントを読んでください。「注:使用android:configChangesは避け、最後の手段としてのみ使用してください。構成変更による再起動を適切に処理する方法の詳細については、ランタイム変更の処理を参照してください。」
Marc Plano-Lesay 2015

保存と復元の例を投稿していただけませんか。
pollaris

6

このソリューションは、断然最良のソリューションです。マニフェストファイルに追加

<activity
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:name="your activity name"
    android:label="@string/app_name" 
    android:screenOrientation="landscape">
  </activity

そしてあなたの活動クラスに次のコードを追加します

@Override
public void onConfigurationChanged(Configuration newConfig) 
{
    super.onConfigurationChanged(newConfig);
    if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //your code
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
  //your code

    }
}

4

マニフェストのすべてのアプリアクティビティタグに追加android:configChanges="keyboardHidden|orientation|screenSize"ます


3

これをあなたに追加するだけです AndroidManifest.xml

<activity android:screenOrientation="landscape">

つまり、アクティビティタグがあります。これを別のパラメーターとして追加します。縦向きが必要な場合は、横向きから縦向きに変更してください。お役に立てれば。


私は画面を回転させる機能を奪おうとは思っていません。アプリをリロードしたくありません...前述のとおりです。
ジミーD

PS ...これはとにかく動作しません。アプリを特定の方向に強制的に表示するだけです。画面を回転してもアクティビティがリロードされます
ジミーD

3

マニフェストファイルで、各アクティビティにこれを追加します。これは役立ちます

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

screenLayoutが私のために機能し、Androidで分割画面用にアプリのサイズを変更するときに更新を防止
Terren

2

上記のすべての答えは私のために働いていません。それで、私は以下のようにlabelwithに言及することで修正しましたscreenOrientation。今はすべてうまく

<activity android:name=".activity.VideoWebViewActivity"
        android:label="@string/app_name"
        android:configChanges="orientation|screenSize"/>


1

onPause()またはにイメージの詳細を保存し、それonStop()をで使用しonCreate(Bundle savedInstanceState)てイメージを復元します。

編集:

実際のプロセスの詳細については、http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycleを参照してください。これは、Honeycombでは以前のAndroidバージョンとは異なるためです。


実際には、onSaveInstanceState()メソッドで実行する必要があります
Willi Mentzel



-1

最善の解決策かどうかはわかりませんが、ここで説明します。

まず最初に、クラスの証明書が必要です。アプリケーションのアプリケーションは、このマニフェストにあります。

<application
    android:name=".App"
    ...

第二に、私のクラスのアプリで私はこのようにしました:

public class App extends Application {
    public static boolean isOrientationChanged = false;

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

    @Override
    public void onConfigurationChanged(@NotNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
                newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            isOrientationChanged = true;
        }
    }

}

3番目に、フラグを方向変更に設定する必要があります。私の場合、アプリナビゲーション内の前のアクティビティが呼び出されたときに常に設定するため、後のアクティビティが作成されたときに1回だけ呼び出します。

isOrientationChanged = false;

したがって、そのコンテキストで画面の向きを変更するたびに、この設定を変更するたびに設定し、向きが変更されているかどうかを確認します。変更されている場合は、そのフラグの値に基づいて検証します。

基本的に、非同期の改造リクエストを行うときはいつでもそれを使用する必要がありました。彼は方向を変えるたびに呼び出し、アプリケーションを常にクラッシュさせていました。

if (!isOrientationChanged) {
    presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}

それが最もエレガントで美しい解決策かどうかはわかりませんが、少なくともここでは機能的です:)


-2

onCreate含むアクティビティの、メソッドの後にこのコードを追加しますWebView

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);    
}

@Override
protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);    
}

1
これはどのように機能しますか?ランタイムに対して明示的に何かを言っているだけではなく、デフォルトで何が行われるのでしょうか?
ダニエルソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.