2

アプリを通常のアクティビティ スタイルからフラグメント スタイルに移植する際に問題が発生します。フラグメントが再作成されるか、バックスタックからポップされると、ビューが失われることに気付き始めています。私が特にリストビューについて話していると言うとき。私がしていることは、アイテムをリストビューにロードしてから画面を回転させることです。戻ると、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();
    }

最終的にやりたいことは、アクティビティを完全に再作成し、フラグメントとすべてを忘れて、アクティビティが横向きモードまたは縦向きモードで開始されたように振る舞うことです。そこにフラグメントは本当に必要ありません。いくつかの保存された変数を使用してプログラムで再作成できます

4

1 に答える 1

4

内からビューへの参照を取得したい場合は、常にメソッドによって返されたをFragment探します。あなたの場合、のビューを探している時点では、おそらくまだアクティビティに関連付けられていないため、参照はnullになります。だからあなたは使用します:ViewViewgetView()ListViewFragment

list = (ListView) getView().findViewById(R.id.sgQuestionsList);
于 2013-02-18T05:17:09.620 に答える