我需要在方向更改时保存列表。为此,我想通过onSavedInstanceState
方法传递数据但是,我不知道如何执行此操作,请参阅下面的示例代码:
private List<EarSrt> leftAnswerList;
private List<EarSrt> rightAnswerList;
@Override
protected void onSaveInstanceState (Bundle outState){
super.onSaveInstanceState(outState);
outState.putCharSequenceArrayList("left_ear", leftAnswerList);
outState.putCharSequenceArrayList("right_ear", rightAnswerList);
}
此代码不起作用,因为我传入自定义列表。
错误:The method putCharSequenceArrayList(String, ArrayList<CharSequence>) in the type Bundle is not applicable for the arguments (String, List<EarSrt>)
如何将此数据传递到捆绑包中?我使用Parcelable
吗?如果是这样,我将如何在Parcelable
方法中使用onSavedStateChanged
?
另外,如何使用onRestoreInstanceState
方法检索数据?如果是这样,我将如何做到这一点?
感谢您的帮助。
修改
所以我刚刚意识到我可以通过以下代码传递它:
@Override
protected void onSaveInstanceState (Bundle outState){
super.onSaveInstanceState(outState);
outState.putParcelable("left_ear", (Parcelable) leftAnswerList);
outState.putParcelable("right_ear", (Parcelable) rightAnswerList);
}
我是否需要使用onRestoreInstanceState
方法,或者我可以在onCreate
方法if(savedInstanceState != null)
中说出来然后做点什么?
修改
onCreate方法:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hearing_test);
ActivityHelper activityHelper = new ActivityHelper(this);
activityHelper.setTitleTextSize(R.string.Hearing_Test, true);
isPhone = activityHelper.isPhone();
if(isPhone){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
View infoView = (View)findViewById(R.id.info_button);
infoView.setVisibility(View.INVISIBLE);
notUnderstoodButton = (Button) findViewById(R.id.not_understood_button);
repeatButton = (Button) findViewById(R.id.repeat_button);
progressTextView = (TextView) findViewById(R.id.progressTextView);
progressTextView.setText("Left ear: Step 1 of 9");
notUnderstoodButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
soundButtonClicked(v);
}
});
repeatButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
noisePlayer.seekTo(0);
testPlayer.seekTo(0);
noisePlayer.start();
testPlayer.start();
disableButtons();
}
});
panLeft = false;
initialiseArrays();
getNextTest(-1);
}
答案 0 :(得分:1)
要通过Bundle
传递数据,需要实现Parceable
接口。在您的情况下,这意味着EarSrt
必须是Parceable
,因为您使用的是List
。请参阅here或here如何实施Parceable
。
要恢复您的数据,使用onRestoreInstanceState
或onCreate
并不重要。引自doc:
当活动出现时,在onStart()之后调用此方法 从之前保存的状态重新初始化,在此处给出 savedInstanceState。大多数实现都会使用 onCreate(Bundle)恢复他们的状态,但有时候 在完成所有初始化之后,这里可以方便地完成 或者允许子类决定是否使用默认值 实现。此方法的默认实现执行 恢复之前被冻结的任何视图状态 的onSaveInstanceState(束)。