2017-04-14 17 views
0

私は同様の質問がされていることは知っていますが、それらの質問に対する解決策はどれも私のために働いていません。Androidがインスタンスの状態を復元していない

私のアプリの状態を保存しようとすると、EditTextビューの状態は保存されず復元されません。私は先に行って、すべてをコメントアウトし、ちょうど保存するために一時的な文字列を入れますが、アプリケーションの負荷がアップし、再び、のonCreate()メソッドは、私が手logcat出力で

package com.fwumdesoft.udppacketsender; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.Toast; 

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetSocketAddress; 

/** 
* Posts a UDP message with the given data to the 
* target address on the target port. 
*/ 
class UdpPostActivity extends AppCompatActivity { 
    private static final String TAG = "UdpPostActivity"; 

    private static final String stateTextTargetHost = "com.fwumdesoft#TargetHost"; 
    private static final String stateTextTargetPort = "com.fwumdesoft#TargetPort"; 
    private static final String stateTextHexData = "com.fwumdesoft#HexData"; 
    private static final String stateTextStringData = "com.fwumdesoft#StringData"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     Log.v(TAG, "onCreate"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_udp_post); 

     if (savedInstanceState != null) { 
//   ((EditText) findViewById(R.id.txtAddress)).setText(savedInstanceState.getString(stateTextTargetHost)); 
//   ((EditText) findViewById(R.id.txtPort)).setText(savedInstanceState.getString(stateTextTargetPort)); 
//   ((EditText) findViewById(R.id.txtData)).setText(savedInstanceState.getString(stateTextHexData)); 
//   ((EditText) findViewById(R.id.txtStringData)).setText(savedInstanceState.getString(stateTextStringData)); 
      String text = savedInstanceState.getString(stateTextStringData); 
      Log.v(TAG, "Restoring instance state"); 
     } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
//  outState.putString(stateTextTargetHost, ((EditText)findViewById(R.id.txtAddress)).getText().toString()); 
//  outState.putString(stateTextTargetPort, ((EditText)findViewById(R.id.txtPort)).getText().toString()); 
//  outState.putString(stateTextHexData, ((EditText)findViewById(R.id.txtData)).getText().toString()); 
//  outState.putString(stateTextStringData, ((EditText)findViewById(R.id.txtStringData)).getText().toString()); 
     super.onSaveInstanceState(outState); 
     outState.putString(stateTextStringData, "test"); 
     Log.v(TAG, "Saved instance state"); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     Log.v(TAG, "onRestore"); 
//  ((EditText)findViewById(R.id.txtAddress)).setText(savedInstanceState.getString(stateTextTargetHost)); 
//  ((EditText)findViewById(R.id.txtPort)).setText(savedInstanceState.getString(stateTextTargetPort)); 
//  ((EditText)findViewById(R.id.txtData)).setText(savedInstanceState.getString(stateTextHexData)); 
//  ((EditText)findViewById(R.id.txtStringData)).setText(savedInstanceState.getString(stateTextStringData)); 

    } 

「インスタンスの状態を復元する」印刷しないとき"保存されたインスタンスの状態"と "onCreate"しかし、私はアプリケーションを再起動すると、 "インスタンスの状態を復元する"または "onRestore"を取得しません。

答えて

0

を当てることがあります。あなたはあなたのマニフェストに設定されているアンドロイド:configChangesを持っていますか?

+0

デバッグモードに入ると、 "onCreate"がlogcat出力に出力されます。私のマニフェストでは、私は 'android:configChanges = "orientation"をアクティビティの属性として持っています。 – jcarrete5

+0

これは、オリエンテーションの変更を意味するので、レイアウトの変更を自分で処理し、ビューをリセットする必要はないと指定するので、onCreateは呼び出されません。あなたのonCreateはアクティビティの開始時にのみ呼び出されるため、オリエンテーションの変更で呼び出されることはありません。そのため、「インスタンス状態の復元」は表示されません。 – Kia

+0

onCreateメソッドは方向変更に呼び出されないかもしれませんが、それは私の問題ではありません。アプリケーションを再び開くと、ログメッセージ 'Log.v(TAG、" onCreate ");が表示されているので、onCreateメソッドが呼び出されています。 onSaveInstanceStateメソッドのバンドルに情報を保存したときに、アプリケーションを再度開いた後にBundle savedInstanceStateがnullであることがわかりません。 – jcarrete5

0

このように、savedInstanceStateがnullでないかどうかを確認するときは、outStateで指定したキーを参照する必要があります。

  if (savedInstanceState != null) { 
      String text = savedInstanceState.getString("test"); 
      Log.v(TAG, "Restoring instance state"); 
     } 

このドキュメントでは、デバッグモードに移動して、あなたのonCreateが呼び出されているかどうかを確認し、いくつかの光

https://developer.android.com/guide/components/activities/activity-lifecycle.html

+0

ありがとうございます。私はこれを試す前にアンドロイドのライフサイクルを見てきましたが、onSaveInstanceStateメソッドが呼び出されたときにBundleに格納する値を与えたときにインスタンスの状態が復元されない理由を理解できません。私はバンドルからキーを読み込むことで問題を解決しました。 – jcarrete5

+0

私はこのポストと思う: http://stackoverflow.com/questions/4096169/onsaveinstancestate-and-onrestoreinstancestate 良い説明があります。 BundleオブジェクトのsavedInstanceStateを使用して、onCreateメソッドで状態を復元する必要があります。これで、テキスト変数を使用して、どのEditTextでもテキストを設定できます。それが働いたら教えてください。 – wnieves19

+0

onCreateメソッドに渡されたBundleから状態を復元しようとしていますが、onCreateメソッドに渡されたBundleがnullです。私は以前にonSaveInstanceStateメソッドのBundleに値を設定していたときに、Bundleがnullになる理由を理解していません。バンドルがnullであるかどうかを判断するにはどうすればよいですか?アクティビティを複数回再起動しますが、バンドルはnullのままです。 – jcarrete5

関連する問題