カスタムの SurveyPage クラスによって生成されたビューをページングする FragmentPagerAdapter があります。ページャーの最終ページは、SurveyFinishPage によって生成されます。SurveyFinishPage は、FragmentPagerAdapter に関連付けられた Survey にアクセスしようとし、すべての調査回答をまとめて表示します。Survey オブジェクトは、メイン アクティビティの getSurvey() メソッドを介して SurveyFinishPage によって取得されます。
通常、これは正常に機能し、SurveyFinishPage は FragmentPagerAdapter が使用している同じ Survey オブジェクトにアクセスできます。ただし、Activity が強制終了されて復元された場合、SurveyFinishPage はまだ古い Survey (またはおそらくそのコピー) にアクセスしているように見えます。新しく再構築された回答への変更に関係なく、Activity が破棄される前の回答が表示されます。調査。
MainActivity がその Survey オブジェクトを FragmentPagerAdapter に渡し、そのオブジェクトを使用して Fragments を作成するため、MainActivity の onRestoreInstanceState() で aSurvey の値を復元すると、他のすべての Survey オブジェクトが確立されるように思えますが、代わりに、 FragmentPagerAdapter と SurveyFinishPage は、2 つの異なるものを見ています。
FragmentPagerAdapter 内のフラグメントの状態を適切に復元して、すべてが同じ Survey オブジェクトを参照するようにするにはどうすればよいですか?
MainActivity.java
public class MainActivity extends FragmentActivity {
SurveyPagerAdapter mSurveyPagerAdapter;
ViewPager mViewPager;
Survey aSurvey;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_poll);
if(savedInstanceState != null) {
testSurvey = savedInstanceState.getParcelable("survey");
}
else {
testSurvey = new Survey();
}
mSurveyPagerAdapter = new SurveyPagerAdapter(getSupportFragmentManager(), aSurvey);
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSurveyPagerAdapter);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("survey", aSurvey);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
aSurvey = (Survey)savedInstanceState.getParcelable("survey");
}
[...]
}
SurveyPagerAdapter.java
public class SurveyPagerAdapter extends FragmentPagerAdapter {
private Survey survey;
[...]
@Override
public Fragment getItem(int i) {
Fragment fragment;
Bundle args = new Bundle();
// index 0 is the title page
if(i == 0) {
fragment = new SurveyTitlePage();
}
// final index is the finish page
else if(i == getCount()-1) {
fragment = new SurveyFinishPage();
}
// all other indices are regular poll pages
else {
args.putParcelable("question", survey.getQuestion(i-1));
fragment = new SurveyPage();
fragment.setArguments(args);
}
return fragment;
}
[...]
}
SurveyFinishPage.java
public class SurveyFinishPage extends Fragment {
private Survey survey;
[...]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setSurvey(((MainPoll)getActivity()).getSurvey());
LinearLayout view = new LinearLayout(getActivity());
view.setOrientation(LinearLayout.VERTICAL);
Button finishButton = new Button(getActivity());
finishButton.setText("FINISH");
final TextView textView = new TextView(getActivity());
finishButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
String output = "";
for(int i=0; i<survey.getSize(); i++) {
try {
output += survey.getQuestion(i).getPrompt() + " - " + survey.getQuestion(i).getAnswer() + "\n";
} catch (Exception e) {
output += survey.getQuestion(i).getPrompt() + " - " + "no answer\n";
}
}
textView.setText(output);
}
});
view.addView(finishButton);
view.addView(textView);
return view;
}
}
SurveyPage.java
public class SurveyPage extends Fragment {
[...]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle args = getArguments();
Question question = args.getParcelable("question");
View pageView = question.getQuestionView(getActivity(), container);
return pageView;
}
}