【问题标题】:Android: content view not yet created when using listview in fragment?Android:在片段中使用列表视图时尚未创建内容视图?
【发布时间】:2013-04-29 08:39:05
【问题描述】:

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

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);
            }
        });
    }
}

提前感谢

【问题讨论】:

  • 检查我在下面给出的答案。

标签: android android-listfragment


【解决方案1】:

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

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

我能想到的最后一件事是将第一组内容添加到您的FragmentActivity,将您的标签添加到ActionBar,并将您的片段附加到第一个/第二个标签上。之后,您可以使用AsyncTask 正确填充ListView 的数据。

【讨论】:

  • 我同意你的前两件事,但是当点击第一个选项卡 ResidentialFragActivity 类加载时,我已经添加了另一个类的选项卡。
  • 您将 FragmentActivity 添加为标签内容?
  • 是的,我的另一个类从该类扩展了 SherlockFragmentActivity,例如Tab tab = actionBar.newTab().setTabListener(new ResidentialFragActivity()).setIcon(R.drawable.residential); actionBar.addTab(tab);
【解决方案2】:

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

 new LoadProjects().execute();

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

更新:-

或在

中调用new LoadProjects().execute();
`onResume()`.it will get called after `onCreate()` or `onCreateView()`

【讨论】:

    【解决方案3】:

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

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

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    
        new LoadProjects().execute();
    }
    

    从那里开始。

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 2013-12-21
      • 2014-04-13
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多