Android在onSavedInstance方法中通过bundle传递列表

时间:2014-05-13 11:43:34

标签: java android

我需要在方向更改时保存列表。为此,我想通过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);
}

1 个答案:

答案 0 :(得分:1)

要通过Bundle传递数据,需要实现Parceable接口。在您的情况下,这意味着EarSrt必须是Parceable,因为您使用的是List。请参阅herehere如何实施Parceable

要恢复您的数据,使用onRestoreInstanceStateonCreate并不重要。引自doc

  

当活动出现时,在onStart()之后调用此方法   从之前保存的状态重新初始化,在此处给出   savedInstanceState。大多数实现都会使用   onCreate(Bundle)恢复他们的状态,但有时候   在完成所有初始化之后,这里可以方便地完成   或者允许子类决定是否使用默认值   实现。此方法的默认实现执行   恢复之前被冻结的任何视图状态   的onSaveInstanceState(束)。