Android 无法访问布局充气器,因为子视图尚未初始化

Android 无法访问布局充气器,因为子视图尚未初始化,android,android-fragments,Android,Android Fragments,我有一个Android活动,它在web服务中搜索要显示的新内容,然后显示一个NoResultFragment或一个ResultFragment,它表示一个滑动堆栈,供用户滑动返回的项目。因为我需要管理堆栈,在堆栈变低时在后台从活动中检索更多数据等,所以所有堆栈详细信息都保存在活动级别,并且活动上的yes/no操作触发方法。到目前为止一切都很好 问题是我在ResultFragment类中使用布局充气器来生成动态子视图,每个子视图表示堆栈上的一个项。然后,这些内容会返回到活动控制器,后者管理它们,将

我有一个Android活动,它在web服务中搜索要显示的新内容,然后显示一个NoResultFragment或一个ResultFragment,它表示一个滑动堆栈,供用户滑动返回的项目。因为我需要管理堆栈,在堆栈变低时在后台从活动中检索更多数据等,所以所有堆栈详细信息都保存在活动级别,并且活动上的yes/no操作触发方法。到目前为止一切都很好

问题是我在ResultFragment类中使用布局充气器来生成动态子视图,每个子视图表示堆栈上的一个项。然后,这些内容会返回到活动控制器,后者管理它们,将它们发送到片段以显示、隐藏它们、移动它们等等,因此我需要从活动访问子项视图来完成所有这些操作。不过,我需要从ResultFragment中生成实际的子视图,因为它们将在那里直观地显示

我创建ResultFragment,将其设置为内容区域,然后尝试通过调用创建的片段来生成子视图。错误在于还没有对ResultFragment类调用onViewCreate()方法,因为它刚刚添加到内容框架中,因此没有LayoutFlater,并且返回子视图的方法失败。我觉得我的设计有点不对劲,有人能告诉我怎么做吗?它是否像从Activity类传递父layoutinflater一样简单

子视图创建方法

public View getChildView(StorySeed seed, int seedIndex)
    {
        final View m_view = inflater.inflate(R.layout.fragment_item, null);                    // Code to populate the view
                      return m_view;
}
活动方法

private void initialiseResults(ArrayList<StorySeed> storySeeds) {
        resultsFragment = new ResultsFragment(storySeeds, getApplicationContext());
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, resultsFragment)
                .commit();

        // load the first results to screen 
        seedIndex = 1;
        for (int i = 0; i < seedsToDisplay; i++) {          
            getNextToStack();           
        }                       
    }
private void initialiseResults(ArrayList storySeeds){
resultsFragment=新的resultsFragment(storySeeds,getApplicationContext());
FragmentManager FragmentManager=getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content\u frame,resultsFragment)
.commit();
//将第一个结果加载到屏幕
种子指数=1;
对于(int i=0;i

正是对getNextToStack()的调用进入片段类并调用getChildView()方法,我建议您在活动(控制器)中创建视图,并根据需要将它们传递给片段。该片段是您的MVC“视图”,它应该只告诉控制器发生了什么。控制员决定之后做什么

让一个片段替换为另一个片段的方法是对活动调用一个方法。下面是一个简单的例子:

interface IAppController {
    void onResultsNotFound();
}

class MyActivity extends Activity implements IAppController{
    ....
    public void onResultNotFound(){
        //switch fragments
    }
}

class MyFragment {
    ....
    void myMethod(){
        IAppController controller = (IAppController) getActivity();
        controller.onResultsNotFound();
    }
}

希望这能有所帮助

我建议您看看活动和片段之间的互动方式。与其让片段创建视图并将它们返回到活动,而不是将其转回到要添加到布局中的片段,而是考虑活动对片段的指定(通过参数),它应该是什么样的“模式”来决定视图和布局。如果你的片段管理复杂和变化的布局,那么考虑把它分解成单独的片段,而不是在一个类中做所有的事情。这就是我最初设计它的方式。我遇到的困难是,我想切换到“加载”模式、“无结果”模式和“找到结果”模式的不同片段。但是,由于所有这些的触发器都来自ResultsFragment,我不知道如何让ResultsFragment告诉应用程序用不同的片段替换自己,我想我必须从活动中执行这一操作。是否有一种方法可以将活动框架的内容从REsultFragment中更改为不同的片段?我不建议直接从片段中执行此操作。相反,让您的ResultFragment定义一个名为ResultCallback的内部接口,您的活动将实现该接口。在ResultFragment的
onAttach
中,检查以确保提供的活动是接口的实例(如果不是,则抛出异常)。然后,当您需要“切换”片段时,只需让ResultFragment调用“已注册”接口,通知其更改。