回転Androidでのアクティビティの再開


1380

私のAndroidアプリケーションでは、デバイスを回転させる(キーボードをスライドさせる)と、Activity再起動されます(onCreateが呼び出されます)。さて、これはおそらく想定どおりの方法ですが、onCreateメソッドで多くの初期設定を行うため、次のいずれかが必要です。

  1. すべての初期設定を別の関数に入れて、デバイスの回転またはすべてで失われないようにします。
  2. onCreate再度呼び出されないようにしてください。レイアウトは調整されるか、
  3. onCreate呼び出されないように、アプリを縦向きのみに制限します。

4
このブログ投稿にも、アクティビティ構成の変更中に長時間実行される非同期タスクを保持する方法に関するかなり完全な説明があります。
エイドリアンモンク

3
他の人がすでに回答しているように、これは直接的な回答ではありませんが、ライフサイクルに関してAndroidアプリで何が起こるかを理解するためにLogLifeCycleを確認することをお勧めします。
Snicolas 2014

回答:


965

アプリケーションクラスの使用

初期化で何をしているのかに応じてApplication、初期化コードを拡張し、onCreateそのクラス内のオーバーライドされたメソッドに移動する新しいクラスを作成することを検討できます。

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

onCreateアプリケーション全体が作成されたときに向きやキーボードの可視性の変更に活動を再起動すると、それをトリガーしないようにアプリケーションクラスでは唯一の、と呼ばれています。

このクラスのインスタンスをシングルトンとして公開し、ゲッターとセッターを使用して初期化しているアプリケーション変数を公開することをお勧めします。

注:登録して使用するには、マニフェストで新しいアプリケーションクラスの名前を指定する必要があります。

<application
    android:name="com.you.yourapp.MyApplicationClass"

構成変更への対応 [更新:これはAPI 13以降廃止されました。推奨される代替案を参照してください ]

さらに別の方法として、向きやキーボードの可視性の変更など、再起動を引き起こすイベントをアプリケーションにリッスンし、アクティビティ内でそれらを処理することができます。

まずandroid:configChanges、アクティビティのマニフェストノードにノードを追加します

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

またはAndroid 3.2(APIレベル13)以降の場合

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

次に、アクティビティ内でonConfigurationChangedメソッドをオーバーライドしてsetContentView、GUIレイアウトを強制的に新しい方向に再実行します。

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}

17
2番目のアプローチが機能するとは思わない。私はそれを試してみました; EditTextを含む1つのアクティビティ。私はそこにいくつかのテキストを書いて、向きを変えました、そして、テキストはなくなっていました/リセットされました。
テッド

231
今後、onRotate()メソッドが見つかることを期待しています。このようなことについてさえ心配する必要があることは、率直に言ってイライラします。
ケリーサットン

84
なお、Androidのデベロッパーガイドを使用してこれに対する注意事項: 注意:使用するには、( android:configChanges)のみ最後の手段として回避して使用する必要があります。構成変更による再起動を適切に処理する方法の詳細については、ランタイム変更の処理を参照してください。 代わりに、ローテーションイベント全体でデータを保持するために、を使用することを好むようですonSaveInstanceState Bundle。または@としてジョン-Oは言及しonRetainNonConfigurationInstance
Jeffro

19
それは現在知らている構成変更にしか反応しないので、それは悪い解決策です。新しいAndroidバージョンでは、このコードがキャッチしない他の構成変更が発生する可能性があります(マニフェスト内のすべての構成変更をリストする必要があるため)。状態を保存するソリューションonRetainNonConfigurationChangesは、フォールトトレラントで簡単です。
Bananeweizen

16
この更新を3.2に回答追加する必要があると思います。これは非常に重要であり(その問題に直面したばかりです)、見落とされる可能性があります。
bigstones 2012年

185

Android 3.2以降のアップデート:

注意:Android 3.2(APIレベル13)以降、デバイスが縦向きと横向きに切り替わると、「画面サイズ」も変更されます。したがって、(minSdkVersionおよびtargetSdkVersion属性で宣言されている)APIレベル13以降の開発時に方向の変更によるランタイムの再起動を防止する場合は、"screenSize"値に加えて値を含める必要があり"orientation"ます。つまり、を宣言する必要がありますandroid:configChanges="orientation|screenSize"。ただし、アプリケーションがAPIレベル12以下をターゲットにしている場合、アクティビティは常にこの構成変更を自身で処理します(この構成変更は、Android 3.2以降のデバイスで実行されている場合でも、アクティビティを再開しません)。


1
明確化に感謝します。これについての上記のコメントは、私がそれを調べようとほとんど思わなかったからです。私は現在API 8を対象としており、私のコードにはconfigChangesにscreenSizeがなく、ICSを実行しているデバイスで(再方向付けなしで)正常に動作することを確認できます。
Carl

これを指摘してくれてありがとう、私はandroid:configChanges = "orientation | screenSize"しか設定していませんでした。方向の切り替えによってアクティビティが再現されましたが、私の人生では理由がわかりませんでした。
クリストファーペリー

5
android:configChangesの追加は、最後の手段としてのみ使用してくださいFragmentsおよびsetRetainInstance代わりに使用することを検討してください。
Simon Forsberg

要点はscreenSizeAndroid 3.2以降であり、私の問題は解決しました。ありがとうございます。
ファンタッチ2016年

127

代わりに、停止しようとしているのonCreate()完全発射されるから、多分チェックしてみてくださいBundle savedInstanceState、それがnullであるかどうかを確認するためにイベントに渡されます。

たとえば、Activityすべての方向の変更ではなく、が本当に作成されたときに実行する必要があるロジックがあるonCreate()場合、そのロジックsavedInstanceStateはがnullの場合にのみ実行します。

それ以外の場合は、方向に合わせてレイアウトを適切に再描画します。

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_game_list);

        if(savedInstanceState == null){
            setupCloudMessaging();
        }
}

これが最終的な答えであるかどうかはわかりませんが、私にとってはうまくいきます。


6
そして、実際にどこに状態を保存していますか?
Ewoks 2012

5
これは私にとってはうまくいくようであり、それははるかに簡単な方法のようです。私は、アプリケーションのサブクラス化に関するアイデアが373であるのに対して、これは4つ(私のものを含めて5つ)しか得られなかったことに気づきました。この方法の欠点はありますか?
steveh 2013

4
この解決策は私にとって素晴らしいものでした。私がすることができたIntent serverintent = new Intent(MainActivity.this, MessageListener.class);し、startService(serverintent);作成することserverSocket = new ServerSocket(0xcff2);Socket client = serverSocket.accept();してBufferedReader(new InputStreamReader(client.getInputStream()));、私のアンドロイドを回転させ、アクティブなクライアント/サーバ接続を維持し、まだGUIの回転を持つことができます。マニュアルによると、最後のアクティビティがシャットダウンすると、saveedInstanceStateが初期化されます。
フレッドF

3
わかりません、何が問題ですか?これはうまく機能し、他のどのソリューションよりも複雑さがはるかに少なくなります。
RTF 2014年

3
これは、Androidでこれを行う正しい方法です。基本的にconfigChangesを使用してローテーションをキャッチする他の方法、およびかさばる、複雑で不要なすべての方法
LukeWaggoner、2014

99

私がしたこと...

マニフェストのアクティビティセクションに、以下を追加しました。

android:configChanges="keyboardHidden|orientation"

実装されたアクティビティのコードで:

//used in onCreate() and onConfigurationChanged() to set up the UI elements
public void InitializeUI()
{
    //get views from ID's
    this.textViewHeaderMainMessage = (TextView) this.findViewById(R.id.TextViewHeaderMainMessage);

    //etc... hook up click listeners, whatever you need from the Views
}

//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    InitializeUI();
}

//this is called when the screen rotates.
// (onCreate is no longer called when screen rotates due to manifest, see: android:configChanges)
@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);

    InitializeUI();
}

3
明確にするために:私の実装では、onCreate()で変数の初期化を行うことができ、onConfigurationChanged()は単に画面の回転のために呼び出されます。これで、変数は画面の回転から隔離されます;-) nice and ez
Someone Somewhere

2
ここで説明したとおりにすべてを実行しましたが、方向を変更した後でボタンを押すと、NullPointerExceptionが発生します。何が悪いのでしょうか?
Finnboy11 2012

5
私の答えは3年前のようなものであり、Androidは進化し続けています。Simon-サンプルコードへのリンクはありますか?それが人々に必要なことです。
誰かどこか

3
android:configChangesに対して警告する場合、@SimonAndréForsbergは実際にはAndroidドキュメントを言い換えているだけです。ランタイムの変更の処理には、代替の詳細情報(サンプルコードを含む)があります。
Leif Arne Storset、2015

67

説明するのはデフォルトの動作です。これらを追加して、これらのイベントを検出して処理する必要があります。

android:configChanges

マニフェストに、そして処理したい変更に。オリエンテーションには、次のようにします。

android:configChanges="orientation"

キーボードを開いたり閉じたりするには、次のようにします。

android:configChanges="keyboardHidden"

両方を処理したい場合は、次のようにパイプコマンドで分離できます。

android:configChanges="keyboardHidden|orientation"

これにより、呼び出すアクティビティでonConfigurationChangedメソッドがトリガーされます。メソッドをオーバーライドすると、新しい値を渡すことができます。

お役に立てれば。


2
@GregD知っています。だからこそ、今日の状況を反映するように更新するのに今が良い時です。この質問の賛成票の数を考えると、SOに関する他の質問からまだ言及されています。
Simon Forsberg

48

私はこの伝承を発見しました:

方向を変更してアクティビティを維持し、を介してそれを処理するためにonConfigurationChanged上記のドキュメントコードサンプルでは、マニフェストファイルでこれを提案しています。

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

常に機能するという追加の利点があります。

ボーナスの伝承が省略されていることをkeyboardHidden論理的に見えるかもしれませんが、それは(少なくともアンドロイド2.1用)エミュレータで障害が発生しますのみ指定すると、orientation両方のエミュレータの呼び出しを行いますOnCreateonConfigurationChanged、時々 、とだけOnCreate他の回。

デバイスで障害が発生するのを見たことはありませんが、他のデバイスでエミュレータが失敗することについて聞いたことがあります。文書化する価値があります。


14
注意:Android 3.2(APIレベル13)以降、デバイスが縦向きと横向きに切り替わると、「画面サイズ」も変更されます。したがって、あなたはAPIレベル13以上のために開発するときに伴う姿勢変化にランタイムの再起動を防止したい場合:アンドロイド:configChanges =「オリエンテーション| keyboardHidden |画面サイズ」
Geltrude

はい、エミュレータは非常に時間がかかります。構成の変更を正確に報告するために、これに依存することはできません。
IgorGanapolsky 2012

android:configChangesの追加は、最後の手段としてのみ使用してくださいFragmentsおよびsetRetainInstance代わりに使用することを検討してください。
Simon Forsberg

38

また、向きの変更にまたがってデータを永続化するAndroidプラットフォームの方法を使用して検討するかもしれない: onRetainNonConfigurationInstance()getLastNonConfigurationInstance()

これにより、サーバーフェッチから取得した情報や、onCreateそれ以降に計算された情報などの構成変更全体でデータを永続化でき、Android Activityは現在使用中の向きのxmlファイルを使用して再レイアウトすることもできます。

こちらまたはこちらをご覧ください。

誰のにスイッチすることを勧告して(上記の解決策のほとんどが示唆として、姿勢の変化を自分で処理するよりものの、依然として、より柔軟な)これらのメソッドは廃止されていることに留意すべきであるFragmentsとの代わりに、使用setRetainInstance(true)ごとにFragment保持したいです。


3
FragmentsとsetRetainInstanceがこれを行うための最良の方法(およびGoogleが推奨する方法)だと私は本当に思います。+ 1をあなたに、-1を他のすべてに。android:configChangesの追加は、最後の手段としてのみ使用してください
Simon Forsberg

32

この方法は便利ですが、フラグメントを使用する場合は不完全です。

通常、フラグメントは構成変更時に再作成されます。これを望まない場合は、

setRetainInstance(true); フラグメントのコンストラクタで

これにより、構成の変更中にフラグメントが保持されます。

http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)


7
同意した。最新のAndroid APIでは、フラグメントはこれを処理する正しい方法のようです。私自身はまだ試していませんが、このページを読んで集めた内容から、基本的に、アクティビティで実装するために使用したものの99%をフラグメントのサブクラスに移動し、そのフラグメントをアクティビティに追加します。アクティビティは引き続き画面の回転時に破棄され、再作成されますが、@ Abdo のメソッドを使用してフラグメントを破棄しないように具体的にAndroidに指示できますsetRetainInstance()
brianmearns 2012

25

私は単に追加しました

     android:configChanges="keyboard|keyboardHidden|orientation"

マニフェストファイルと追加していないすべてのonConfigurationChanged私の活動の方法を。

したがって、キーボードがスライドするか、何も起こらないたびに


に追加され<application ...android:configChanges="keyboard|keyboardHidden|orientation">、動作しています。build.gradleでの私の設定:minSdkVersion 15, compileSdkVersion 23, buildToolsVersion "23.0.2"
ジュニアメイヘ

19

onCreateあなたが変更されたときに方法はまださえ呼ばれるorientationアンドロイドの。したがって、すべての重い機能をこのメソッドに移動しても、助けにはなりません



17
 onConfigurationChanged is called when the screen rotates. 
 (onCreate is no longer called when screen rotates due to manifest, see:  
 android:configChanges)

マニフェストのどの部分に「呼び出さないでください」と表示されていonCreate()ますか?

また、Googleのドキュメントは使用しないように言ってandroid:configChanges(最後の手段として以外)....しかし、その後、別の方法は、彼らがすべての提案DOの使用をandroid:configChanges

エミュレータが常にonCreate()ローテーションを要求するのは、私の経験です。
しかし、私が同じコードを実行している1〜2台のデバイスは、そうではありません。(違いがある理由がわかりません。)


16

次の手順を実行するだけで非常に簡単です。

<activity
    android:name=".Test"
    android:configChanges="orientation|screenSize"
    android:screenOrientation="landscape" >
</activity>

これは私にとってはうまくいきます:

注:オリエンテーションはあなたの要件に依存します


15

Androidマニフェストで行われる変更は次のとおりです。

android:configChanges="keyboardHidden|orientation" 

アクティビティ内で行われる追加は次のとおりです。

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

15

この行をマニフェストに追加します:-

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

そして、このスニペットをアクティビティに:-

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

14

これにはいくつかの方法があります。

アクティビティ状態を保存

アクティビティの状態はに保存できますonSaveInstanceState

@Override
public void onSaveInstanceState(Bundle outState) {
    /*Save your data to be restored here
    Example : outState.putLong("time_state", time); , time is a long variable*/
    super.onSaveInstanceState(outState);
}

を使用しbundleて状態を復元します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState!= null){
       /*When rotation occurs
        Example : time = savedInstanceState.getLong("time_state", 0); */
    } else {
      //When onCreate is called for the first time
    }
}

自分で向きの変更を処理する

もう1つの方法は、向きの変更を自分で処理することです。しかし、これは良い習慣とは見なされていません。

これをマニフェストファイルに追加します。

android:configChanges="keyboardHidden|orientation"

Android 3.2以降の場合:

android:configChanges="keyboardHidden|orientation|screenSize"

@Override
public void onConfigurationChanged(Configuration config) {
    super.onConfigurationChanged(config);

if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        //Handle rotation from landscape to portarit mode here
    } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        //Handle rotation from portrait to landscape mode here
    }
}

ローテーションを制限する

回転を避けるために、アクティビティを縦向きまたは横向きに制限することもできます。

これをマニフェストファイルのアクティビティタグに追加します。

        android:screenOrientation="portrait"

または、これをプログラムでアクティビティに実装します。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

11

これを行うために私が見つけた方法は、onRestoreInstanceStateおよびonSaveInstanceStateイベントを使用して何かを保存することBundleです(変数を保存する必要がない場合でも、そこに何かを入れてBundle空にならないようにします)。次に、onCreateメソッドで、Bundleが空かどうかを確認し、空の場合は初期化を行い、そうでない場合はそれを実行します。


11

「Androidの方法」ではありませんが、向きの変更を自分で処理し、変更された向きを考慮するためにビュー内でウィジェットを再配置するだけで、非常に良い結果が得られました。ビューを保存して復元する必要がないため、これは他のどのアプローチよりも高速です。また、再配置されたウィジェットはまったく同じウィジェットであり、移動またはサイズ変更されたため、ユーザーによりシームレスなエクスペリエンスを提供します。このようにして、モデルの状態だけでなくビューの状態も保存できます。

RelativeLayout時々、向きを変えなければならないビューには、良い選択になることがあります。子ウィジェットごとに、相対的な配置ルールが異なる、縦向きのレイアウトパラメータと横向きのレイアウトパラメータのセットを提供するだけです。次に、onConfigurationChanged()メソッドで、適切なものをsetLayoutParams()各子の呼び出しに渡します。子コントロール自体を内部で向きを変える必要がある場合は、その子のメソッドを呼び出して向きを変更するだけです。あの子は同様のいずれかでメソッドを呼び出しというように、内部の再配向が必要な子コントロール。


私はこれのいくつかのサンプルコードを見てみたいです、素晴らしいようです!
Henrique de Sousa

8

画面が回転するたびに、開かれたアクティビティが終了し、onCreate()が再度呼び出されます。

1。画面が回転したときにアクティビティの状態を保存して、アクティビティのonCreate()が再度呼び出されたときに古いものをすべて復元することができます。参照してくださいこの リンクを

2。アクティビティの再起動を防ぎたい場合は、manifest.xmlファイルに次の行を追加してください。

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

7

onSavedInstanceStateメソッドを使用して、すべての値をパラメータに格納する必要があります。

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outPersistentState.putBoolean("key",value);
    }

そして使う

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        savedInstanceState.getBoolean("key");
    } 

画面の回転を処理するオブジェクトを表示するための値を取得および設定するには


これは、APIレベル22必要
ムハンマド・Afrashteh

6

注:将来誰かが私と同じ問題に直面した場合は、この回答を投稿します。私にとって、次の行は十分ではありませんでした:

android:configChanges="orientation"

画面を回転させたときに、 `onConfigurationChanged(Configuration newConfig)メソッドが呼び出されませんでした。

解決策:問題が向きに関係している場合でも、「screenSize」を追加する必要もありました。したがって、AndroidManifest.xml-ファイルに、次を追加します。

android:configChanges="keyboardHidden|orientation|screenSize"

次に、メソッドを実装します onConfigurationChanged(Configuration newConfig)




4

人々はあなたが使うべきだと言っています

android:configChanges="keyboardHidden|orientation"

しかし、Androidでローテーションを処理するための最良かつ最も専門的な方法は、Loaderクラスを使用することです。有名なクラスではありませんが(理由はわかりません)、AsyncTaskよりもはるかに優れています。詳細については、UdacityのAndroidコースにあるAndroidチュートリアルをご覧ください。

もちろん、別の方法として、onSaveInstanceStateを使用して値またはビューを保存し、onRestoreInstanceStateを使用してそれらを読み取ることができます。本当にあなた次第です。


ええ、「プロフェッショナル」に見えるように追加のコードの塊を追加しましょう。または、ConfigurationChanges属性を使用して、すばやく、簡単で、真に試行錯誤した方法を使用するのはどうですか。
AndroidDev

3

しばらく試行錯誤した結果、ほとんどの状況で自分のニーズに合った解決策を見つけました。ここにコードがあります:

マニフェスト構成:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.pepperonas.myapplication">

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

主な活動:

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    private Fragment mFragment;

    private int mSelected = -1;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate  " + "");

        // null check not realy needed - but just in case...
        if (savedInstanceState == null) {

            initUi();

            // get an instance of FragmentTransaction from your Activity
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            /*IMPORTANT: Do the INITIAL(!) transaction only once!
            * If we call this everytime the layout changes orientation,
            * we will end with a messy, half-working UI.
            * */
            mFragment = FragmentOne.newInstance(mSelected = 0);
            fragmentTransaction.add(R.id.frame, mFragment);
            fragmentTransaction.commit();
        }
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged  " +
                   (newConfig.orientation
                    == Configuration.ORIENTATION_LANDSCAPE
                    ? "landscape" : "portrait"));

        initUi();

        Log.i(TAG, "onConfigurationChanged - last selected: " + mSelected);
        makeFragmentTransaction(mSelected);
    }


    /**
     * Called from {@link #onCreate} and {@link #onConfigurationChanged}
     */
    private void initUi() {
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate  instanceState == null / reinitializing..." + "");
        Button btnFragmentOne = (Button) findViewById(R.id.btn_fragment_one);
        Button btnFragmentTwo = (Button) findViewById(R.id.btn_fragment_two);
        btnFragmentOne.setOnClickListener(this);
        btnFragmentTwo.setOnClickListener(this);
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME!!!");
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME, AS WELL!!!");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume  " + "");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause  " + "");
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy  " + "");
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btn_fragment_one:
                Log.d(TAG, "onClick btn_fragment_one " + "");
                makeFragmentTransaction(0);
                break;

            case R.id.btn_fragment_two:
                Log.d(TAG, "onClick btn_fragment_two " + "");
                makeFragmentTransaction(1);
                break;

            default:
                Log.d(TAG, "onClick  null - wtf?!" + "");
        }
    }


    /**
     * We replace the current Fragment with the selected one.
     * Note: It's called from {@link #onConfigurationChanged} as well.
     */
    private void makeFragmentTransaction(int selection) {

        switch (selection) {
            case 0:
                mFragment = FragmentOne.newInstance(mSelected = 0);
                break;
            case 1:
                mFragment = FragmentTwo.newInstance(mSelected = 1);
                break;
        }

        // Create new transaction
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(R.id.frame, mFragment);

        /*This would add the Fragment to the backstack...
        * But right now we comment it out.*/
        //        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

}

そして、サンプルフラグメント:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author Martin Pfeffer (pepperonas)
 */
public class FragmentOne extends Fragment {

    private static final String TAG = "FragmentOne";


    public static Fragment newInstance(int i) {
        Fragment fragment = new FragmentOne();
        Bundle args = new Bundle();
        args.putInt("the_id", i);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView  " + "");
        return inflater.inflate(R.layout.fragment_one, container, false);
    }

}

上で見つけることができますgithubの


3

orientationリスナーを使用して、さまざまな向きでさまざまなタスクを実行します。

@Override
public void onConfigurationChanged(Configuration myConfig) 
{
    super.onConfigurationChanged(myConfig);
    int orient = getResources().getConfiguration().orientation; 
    switch(orient) 
    {
       case Configuration.ORIENTATION_LANDSCAPE:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
       case Configuration.ORIENTATION_PORTRAIT:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
       default:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}

3

あなたのコードの下にこれを置くActivityの中でAndroid Manifest

android:configChanges="orientation"

方向を変更しても、アクティビティは再開されません。


2
@Mavamaartenおそらく他の人が指摘したように、それは悪いことであり、他の10の回答がすでにこれをカバーしています。
MikkoP 2014年

3

画面の向き(横向きまたは縦向き)を修正します AndroidManifest.xml

android:screenOrientation="portrait" または android:screenOrientation="landscape"

このため、onResume()メソッドは呼び出されません。


5
地獄が何かを修正することはどのように答えですか?デバイスを使用しているユーザーをロックすると、デバイスが回転するのはなぜですか?
2014年

3

グーグルによって導入されたAndroidのarchitechureの最高のコンポーネントの1つは、ViewModelであるすべての要件を満たします。

これは、UI関連のデータをライフサイクルの方法で保存および管理するように設計されており、画面が回転してもデータが存続できるようにします

class MyViewModel : ViewModel() {

これを参照してください:https : //developer.android.com/topic/libraries/architecture/viewmodel


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