2017-04-14 57 views
0

我知道类似的问题已经被问到,但这些问题的解决方案都没有为我工作。Android不恢复实例状态

当我继续尝试保存我的应用程序的状态时,EditText视图的状态不会被保存和恢复。我继续和评论的一切了,只是放在一个临时字符串来保存,但是当应用程序加载再升,在onCreate()方法不打印“恢复实例状态”

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

    } 

在logcat的输出我得到“保存的实例状态”,然后“onCreate”,但我没有在重新启动应用程序时得到“恢复实例状态”或“onRestore”。

回答

0

进入调试模式,看看是否被调用您的onCreate。你的清单中是否设置了android:configChanges?

+0

当我进入调试模式时,“onCreate”确实打印到logcat输出。在我的清单中,我有'android:configChanges ='orientation''作为活动的属性。 – jcarrete5

+0

这意味着在方向更改时,onCreate不会被调用,因为您指定要自己处理布局中的更改,并且不需要重置视图。您的onCreate只会在活动开始时被调用,所以它不会在方向更改时调用。这就是为什么你没有看到“恢复实例状态”。 – Kia

+0

onCreate方法可能不会调用方向更改,但这不是我的问题所在。自从我的日志消息Log.v(TAG,“onCreate”)以来,当我重新打开该应用程序时,onCreate方法会被调用;当我重新打开该应用程序时,正在打印该文件。我不确定为什么在我将onSaveInstanceState方法的Bundle中的信息保存到应用程序后重新打开应用程序时Bundle savedInstanceState为null – jcarrete5

0

当检查savedInstanceState是否为null时,应参考您在outState中输入的键。

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

这个文件也可以提供一些线索

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

+0

谢谢你的回答。在尝试此操作之前,我已经查看了android生命周期,但我无法理解为什么在调用onSaveInstanceState方法时,我给它一个存储在Bundle中的值时,实例状态不会恢复。我通过阅读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将为空。什么决定了Bundle是否为空?我正在多次重新启动该活动,但该包仍然为空。 – jcarrete5