1

我有两个选项卡的片段,每个选项卡都有各自的片段。每个选项卡都有自己的列表,该列表是从服务器加载的。但是我的应用程序遇到了异常,例如

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.oj.bs/com.oj.bs.ProjectFragActivity}:java.lang.IllegalStateException:尚未创建内容视图

我不明白问题出在哪里。谁能告诉我我做错了什么?

以下是我的片段类

public class ResidentialFragActivity extends SherlockListFragment implements ActionBar.TabListener{

ListView listview;
ListView resListviewId;
...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().setContentView(R.layout.residential_list);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle saved) {

    View view = inflater.inflate(R.layout.residential_list,container, false);
    resListviewId = (ListView)view.findViewById(R.id.resProjListView);
    projectList = new ArrayList<HashMap<String,String>>();
    new LoadProjects().execute();

    ListView listview = getListView();
    listview.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int arg2,
                long arg3) {
            Intent href = new Intent(getSherlockActivity(), ProjectDetailActivity.class);

                    String proj_id = ((TextView) view.findViewById(R.id.projectId)).getText().toString();  
                        href.putExtra("proj_id", proj_id);     
            getSherlockActivity().startActivity(href);
        }
    });
    if (container == null) {
        return null;
    }
    return view;
}

public void onStart() {
    super.onStart();
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    ft.add(android.R.id.content,this,"residential");
    ft.attach(this);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    ft.detach(this);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

//inner class for network operation
private class LoadProjects extends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... params) {
        ..........
        //get data from the latest server
        String jsonpProjList = ResdProj.makeHttpReqToSrvr(projectUrl, "POST", projRes);

        return null;
    }
    @Override
    protected void onPostExecute(String result) {

        getSherlockActivity().runOnUiThread(new Runnable() {

            @Override
            public void run() {
                ListAdapter projAdapter = new SimpleAdapter(getSherlockActivity(),
                        projectList, R.layout.residential_list_item, 
                        new String[] {PROJ_ID,PROJ_NAME}, new int[] 
                            {R.id.projectId,R.id.projectName});
                //updating the UI
                setListAdapter(projAdapter);
            }
        });
    }
}

提前感谢

4

3 回答 3

1

首先,我可以在您的代码中看到很多“坏事”。我永远不会做的第一件事是,我不确定它是否会起作用getActivity().setContentView(R.layout.residential_list);。您可以Fragments使用 xml 添加到 FragmentActivity 或直接添加到FrameLayout. 只需查看 Android 中的示例,Fragments了解如何实现此Fragments的最佳实践。

第二件事,不需要在 中使用它runOnUiThreadonPostExecute()因为它已经在 UI 线程上运行。

我能想到的最后一件事是首先将内容添加到您的FragmentActivity,添加您的标签ActionBar并将您的片段附加到第一个/第二个标签上。之后,您可以ListView使用AsyncTask.

于 2013-04-29T09:02:28.407 回答
0

因此,您必须记住,您生活在一个疯狂的世界中,您可以在其中为 Fragment 创建视图,并且它与包含它的 Activity 分离,因此尽管您的 Fragment 的视图已准备好,但它不在屏幕上,并且您的“内容视图尚未创建”。

您将要onActivityCreated在 Fragment 上实现并调用

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    new LoadProjects().execute();
}

从那里。

这将确保您的片段和活动都被创建。但是等等还有更多。另请记住,您可以使用 离开您的活动activity.startActivity(...),并且您的片段可能仍然存在(可能分离可能消失)。在这种情况下,onActivityCreated当您的活动恢复并重新附加您的片段时,将再次调用。所以这可能会比你现在想要的更频繁地调用。

关于何时真正触发它的业务逻辑,我将由您自己决定,或者如果您离开活动,则可以重新加载该内容。祝你好运。

于 2014-02-05T20:53:04.513 回答
0

我认为这是问题所在,但不确定。

 new LoadProjects().execute();

你在listview创建之前调用它,这就是为什么在创建之后没有view调用listview

更新:-

new LoadProjects().execute();在内部调用

`onResume()`.it will get called after `onCreate()` or `onCreateView()`
于 2013-04-29T08:54:31.240 回答