ListFragment中的异常:指定的子级已有父级

时间:2013-01-12 11:06:59

标签: android listview android-listfragment

我正在制作一个下载程序应用程序,并且在onCreateView返回部分后我得到了孩子的父母错误。 我尝试了很多东西,但没有任何帮助。我试过了: ((ViewGroup)dlistView.getParent()).removeView(dlistView); 之后编译器说:

01-12 12:05:15.558: E/AndroidRuntime(10740): java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'

或删除容器/我有一个npe /或删除V但V.getParent()为null。

  

哪个视图是父视图,哪个视图是子视图?

代码:

public static class DownloadingFragment extends ListFragment {
public static final String ARG_SECTION_NUMBER = "section_number";
        public DownloadingFragment() {
        }

        @Override
        public View onCreateView (LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View V = inflater.inflate (R.layout.list, null);    
            ListView dlistView = (ListView) V.findViewById(R.id.dlist);
            List<DownloadInfo> downloadInfo = new ArrayList<DownloadInfo>();
            downloadInfo.add(new DownloadInfo("File", 1000));
            DownloadInfoArrayAdapter diaa = new DownloadInfoArrayAdapter(
                    getActivity().getApplication(),R.layout.list, downloadInfo);
            dlistView.setAdapter(diaa);
        return dlistView; // throw exception 
        }
    }
//...
}

提前感谢您的帮助。

编辑: 新代码:

public static class DownloadingFragment extends Fragment {
        public static final String ARG_SECTION_NUMBER = "section_number";
        public DownloadingFragment() {
        }
        @Override
        public View onCreateView (LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View V = inflater.inflate (R.layout.list, null);    
        return V;
        }

        @Override
        public void onStart() {
            // TODO Auto-generated method stub
            super.onStart();
            ListView dlistView = (ListView) getView().findViewById(R.id.dlist);
            List<DownloadInfo> downloadInfo = new ArrayList<DownloadInfo>();
            downloadInfo.add(new DownloadInfo("File", 1000));
            DownloadInfoArrayAdapter diaa = new DownloadInfoArrayAdapter(
                    getActivity().getApplication(),R.layout.list, downloadInfo);
            dlistView.setAdapter(diaa);
        }
    }
//...
}

2 个答案:

答案 0 :(得分:1)

那是因为你返回了一个有一个父类的列表视图(在V的布局树中的某个地方)。

对于任何类型的片段,onCreateView都应该返回一个没有任何父片段的视图。

在这种情况下,因为它是一个listFragment,所以创建listview(使用xml或以编程方式),然后返回它。不要让它有任何父母,因为它需要父母作为片段。

阅读here了解更多信息:

  

系统在片段绘制时调用它   用户界面第一次。要为您的片段绘制UI,您   必须从此方法返回一个视图,这是您的根   片段的布局。如果片段没有,则可以返回null   提供用户界面。

答案 1 :(得分:1)

请注意,inflate的第三个参数为false。 所以替换这一行

View V = inflater.inflate (R.layout.list, null);    

用这个

View V = inflater.inflate (R.layout.list, null,false); 

你完成了。这有帮助。