アプリを通常のアクティビティ スタイルからフラグメント スタイルに移植する際に問題が発生します。フラグメントが再作成されるか、バックスタックからポップされると、ビューが失われることに気付き始めています。私が特にリストビューについて話していると言うとき。私がしていることは、アイテムをリストビューにロードしてから画面を回転させることです。戻ると、nullpointerexception が発生します。私はそれをデバッグし、リストビューがnullであることを確認しました。フラグメントに関連するコードは次のとおりです
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
return inflater.inflate(R.layout.sg_question_frag, viewGroup, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
list = (ListView)getActivity().findViewById(R.id.sgQuestionsList);
if (savedInstanceState != null) {
catId = savedInstanceState.getInt("catId");
catTitle = savedInstanceState.getString("catTitle");
}
populateList(catId, catTitle);
}
そして、これがどのように呼び出されるかです(他にもいくつかのフラグメントが使用されていることに注意してください)
@Override
public void onTopicSelected(int id, String catTitle) {
// TODO Auto-generated method stub
FragmentManager fm = this.getSupportFragmentManager();
SGQuestionFragment sgQuestFrag = (SGQuestionFragment) fm.findFragmentByTag("SgQuestionList");
FragmentTransaction ft = fm.beginTransaction();
//If the fragment isnt instantiated
if (sgQuestFrag == null) {
sgQuestFrag = new SGQuestionFragment();
sgQuestFrag.catId = id;
sgQuestFrag.catTitle = catTitle;
//Fragment isnt there, so we have to put it there
if (mDualPane) {
//TO-DO
//If we are not in dual pane view, then add the fragment to the second container
ft.add(R.id.sgQuestionContainer, sgQuestFrag,"SgQuestionList").commit();
} else {
ft.replace(R.id.singlePaneStudyGuide, sgQuestFrag, "SqQuestionList").addToBackStack(null).commit();
}
} else if (sgQuestFrag != null) {
if (sgQuestFrag.isVisible()) {
sgQuestFrag.updateList(id, catTitle);
} else {
sgQuestFrag.catId = id;
sgQuestFrag.catTitle = catTitle;
ft.replace(R.id.sgQuestionContainer, sgQuestFrag, "SgQuestionList");
ft.addToBackStack(null);
ft.commit();
sgQuestFrag.updateList(id, catTitle);
}
}
fm.executePendingTransactions();
}
最終的にやりたいことは、アクティビティを完全に再作成し、フラグメントとすべてを忘れて、アクティビティが横向きモードまたは縦向きモードで開始されたように振る舞うことです。そこにフラグメントは本当に必要ありません。いくつかの保存された変数を使用してプログラムで再作成できます