方向更改时,片段视图为空

Posted

技术标签:

【中文标题】方向更改时,片段视图为空【英文标题】:Fragments view is null when orientation changed 【发布时间】:2013-02-17 02:42:21 【问题描述】:

在将我的应用程序从正常活动样式移植到片段样式时,我遇到了一些问题。我开始注意到,当一个片段被重新创建或从后台堆栈中弹出时,它会失去它的视图。当我说我特别在谈论一个列表视图时。我正在做的是将项目加载到列表视图中,然后旋转屏幕。当它返回时,它会得到一个空指针异常。我调试它,果然列表视图为空。这是片段的相关代码

@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();
    

我最终希望它做的是完全重新创建活动,忘记片段和所有内容,就像活动以横向模式或纵向模式启动一样。我真的不需要那里的片段,我可以使用一些保存的变量以编程方式重新创建它们

【问题讨论】:

如果列表位于onCreateView 方法中的膨胀布局中,则不应在活动中查找ListView。使用getView().findViewById... 我不是在activity中寻找listview,而是在onActivityCreated方法的fragment中寻找它 我不知道这是否是你的意思,但我将 getActivity().findViewById 更改为 getView().findViewById ,它就像一个魅力,谢谢。如果您将其发布为答案,我将接受它 【参考方案1】:

如果您想从Fragment 中获取对视图的引用,请始终在getView() 方法返回的View 中查找View。在您的情况下,在您查找ListView 时,Fragment 的视图可能尚未附加到活动,因此引用将为空。所以你使用:

list = (ListView) getView().findViewById(R.id.sgQuestionsList);

【讨论】:

你刚刚拯救了我的早晨!

以上是关于方向更改时,片段视图为空的主要内容,如果未能解决你的问题,请参考以下文章

如何在屏幕方向更改时附加片段?

如果 SQLite 为空或有记录,则更改片段中的视图

方向/配置更改后如何维护 ListView 片段状态?

方向更改后片段中的 getActivity() 为空

在方向更改时保留列表片段中的列表

从父活动调用时,片段视图为空