保存和恢复活动的状态 - Bundle始终为空?
问题描述:
我知道这个问题随处可见,而且我试过寻找这样的答案:onSaveInstanceState not working,因为它与我的类似,但是我找不到解决方案。保存和恢复活动的状态 - Bundle始终为空?
这是我的代码:
public class SelectCamera extends AppCompatActivity {
static final String LIST_SAVE = "CAM-LIST";
String testString = "";
String testString02 = "please work";
private static final String TAG = "SELECTCAMERA ";
IPCamera ic = new IPCamera("Demo cam", "http://trackfield.webcam.oregonstate.edu/axis-cgi/mjpg/video.cgi?resolution=800x600&%3bdummy=1333689998337", "admin1", "password", this);
IPCamera testc = new IPCamera("TEST", "test.com", "admin1", "password", this);
static ArrayList<IPCamera> listOfCameras = new ArrayList<IPCamera>(); //Arrays.asList(ic)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
System.out.println("WHAT IS SAVED: " + savedInstanceState.toString());
} catch (NullPointerException e){
System.out.println("NOTHING IS HERE ATM");
}
if (savedInstanceState != null) {
System.out.println("THERE IS A SAVE --------------------");
//listOfCameras.clear();
listOfCameras = savedInstanceState.getParcelableArrayList(LIST_SAVE);
testString = savedInstanceState.getString("test");
} else {
System.out.println("I am an IDIOT.....");
listOfCameras.add(ic);
listOfCameras.add(testc);
}
System.out.println("DOES THIS WORK: " + testString);
setContentView(R.layout.select_camera);
final ListView lv = (ListView) findViewById(R.id.cameraList);
camListAdapter adapter = new camListAdapter(this, listOfCameras);
lv.setAdapter(adapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
IPCamera listItem = (IPCamera) lv.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), "Camera \"" + listItem.name + "\" selected", Toast.LENGTH_SHORT).show();
ConnectCamera.title = listItem.name;
IPCamera cameraData = listItem;
Intent i = new Intent(getApplicationContext(), ConnectCamera.class);
i.putExtra("selectedCamera", cameraData);
startActivity(i);
}
});
}
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
Log.i(TAG, "Saving state.......");
savedInstanceState.putParcelableArrayList(LIST_SAVE, listOfCameras);
savedInstanceState.putSerializable("Camlist", listOfCameras);
savedInstanceState.putString("test", testString02);
super.onSaveInstanceState(savedInstanceState);
System.out.println(savedInstanceState.toString());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i(TAG, "RESTORING......");
System.out.println(savedInstanceState.toString());
super.onRestoreInstanceState(savedInstanceState);
listOfCameras = savedInstanceState.getParcelableArrayList(LIST_SAVE);
testString = savedInstanceState.getString("test");
}
}
class camListAdapter extends ArrayAdapter<IPCamera> {
public camListAdapter(Context context, ArrayList<IPCamera> cams) {
super(context, 0, cams);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
IPCamera camera = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.select_camera_item, parent, false);
}
// Lookup view for data population
TextView tvName = (TextView) convertView.findViewById(R.id.camName);
TextView tvHome = (TextView) convertView.findViewById(R.id.camURL);
// Populate the data into the template view using the data object
tvName.setText(camera.name);
tvHome.setText(camera.url);
// Return the completed view to render on screen
return convertView;
}
}
正如你可以看到我有很多的print语句,试图找出什么错误,为什么。无论我如何销毁活动,或者如果我移动到其他活动,Bundle都会得到保存,我知道这一点,因为当打印Bundle时,活动被销毁,它会正确打印,但是当我返回活动时Bundle始终为空。任何帮助?
答
尝试致电super.onSaveInstanceState
在该方法(最后一行)的结束,super.onRestoreInstanceState
开头(第一行)
+1
当超级方法被调用时onCreate仍然会做正确的事情并不重要 –
+0
我试过这个,它只是导致应用程序崩溃 – Mattzo26
捆绑的onSaveInstanceState中和onRestoreInstanceState使用不保存数据持久......它更因为(极大简化)在活动backstack或方向更改之间存储数据... – Selvin
@Selvin我将如何去保存数据持久性?因为这是我想要达到的目标 – Mattzo26