我有两个标签片段,每个标签都有相应的片段。每个选项卡都有自己的列表,从服务器加载。但我的应用程序遇到了像
这样的异常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);
}
});
}
}
感谢Adavance
答案 0 :(得分:1)
首先,我可以在代码中看到很多“坏事”。我永远不会做的第一件事我不确定它会起作用getActivity().setContentView(R.layout.residential_list);
。您可以使用xml将Fragments
添加到FragmentActivity或直接添加到FrameLayout
。只需查看Android中Fragments
的示例,了解如何实现此Fragments的最佳做法。
第二件事,无需在runOnUiThread
中使用此onPostExecute()
,因为它已在UI线程上运行。
我能想到的最后一件事就是首先将内容设置为FragmentActivity
,将标签添加到ActionBar
并在第一个/第二个标签上附加您的片段。之后,您可以使用ListView
正确填充数据AsyncTask
。
答案 1 :(得分:0)
我认为这是问题,但不确定。
new LoadProjects().execute();
您在listview
创建之前调用此内容,这就是view
创建后没有listview
调用的原因。
<强>更新: - 强>
或在
中调用new LoadProjects().execute();
`onResume()`.it will get called after `onCreate()` or `onCreateView()`
答案 2 :(得分:0)
所以你必须记住你生活在一个疯狂的世界,在那里你可以为你的片段创建视图,并且它与包含它的Activity分离,所以你的片段的视图已准备就绪,它不在屏幕上并且你的“内容”视图尚未创建“。
您将要在Fragment上实施onActivityCreated
并致电
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new LoadProjects().execute();
}
从那里开始。
这将确保您的片段和活动都已创建。但等等还有更多。另外请记住,您可以使用activity.startActivity(...)
离开您的活动,并且您的片段可能仍然存在(可能已经超脱)。在这种情况下,当您的活动恢复并重新连接您的片段时,onActivityCreated
将再次被调用。所以这可能比你现在想要的更频繁地被调用。
我会告诉你什么时候真正触发它的业务逻辑,或者如果你离开活动就可以重新加载那些内容。祝你好运。