包括list_content到列表布局以保留ListFragmentfunction

首先,我使用Android兼容性库V4 rev.3为我的1.6(甜甜圈)

首次创建ListFragment时,它会显示一个不确定的进度指示器,直到您使用setListAdabpter()。 根据ListFragment.onCreateView的文档,如果我想使用自定义布局:

如果您使用自己的自定义内容覆盖此方法,请考虑在布局文件中包含标准布局{@link android.R.layout#list_content},以便继续保留ListFragment的所有标准行为。 特别是,这是目前显示内置不确定进度状态的唯一方法。

问题是,当我进入我的布局文件并尝试: 它(eclipse)告诉我

资源不公开。 (在’layout’中,值为’@android:layout / list_content’)。

我认为这意味着我的V4源代码中不存在list_content.xml 。 这是正确的,因为它根据API v11中出现的文档。

我只是假设它将存在于兼容性库源中,不知道它是否…

我能看到的唯一其他解决方案是挖掘android的API V11源代码并复制并粘贴list_content.xml 。 但是现在我想避开这个hackery。 这是唯一的解决方案吗?

兼容性库中包含的ListFragment似乎不像实际那样使用该布局(list_content)。 这可能是因为它以jarforms提供,并且无法打包资源。 以下是其onCreateView的内容:

兼容性库中的ListFragment:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final Context context = getActivity(); FrameLayout root = new FrameLayout(context); // ------------------------------------------------------------------ LinearLayout pframe = new LinearLayout(context); pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID); pframe.setOrientation(LinearLayout.VERTICAL); pframe.setVisibility(View.GONE); pframe.setGravity(Gravity.CENTER); ProgressBar progress = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge); pframe.addView(progress, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); root.addView(pframe, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); // ------------------------------------------------------------------ FrameLayout lframe = new FrameLayout(context); lframe.setId(INTERNAL_LIST_CONTAINER_ID); TextView tv = new TextView(getActivity()); tv.setId(INTERNAL_EMPTY_ID); tv.setGravity(Gravity.CENTER); lframe.addView(tv, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); ListView lv = new ListView(getActivity()); lv.setId(android.R.id.list); lv.setDrawSelectorOnTop(false); lframe.addView(lv, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); root.addView(lframe, new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); // ------------------------------------------------------------------ root.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); return root; } 

来自Android 4.0的ListFragment:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(com.android.internal.R.layout.list_content, container, false); } 

鉴于从APIv11源复制布局文件和包含此视图初始化代码之间的选择,我认为很明显哪一个将被视为“hackery”;)

我很沮丧地看到使用支持库无法使用list_content布局。 我的方法只是重用ListFragment的默认onCreateView方法,并将其添加为我的自定义布局的一部分:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View listContent = super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.my_custom_layout, container, false); FrameLayout listContainer = (FrameLayout) v.findViewById(R.id.my_list_container); listContainer.addView(listContent); return v; } 

我添加了一个FrameLayout,其中ListView曾经是我的自定义布局。

在使用兼容性库时,将default @ android.R.layout / list_content合并到自定义布局中的一种可能的解决方法是创建一个虚拟ListFragment:

 package com.example.app; import android.support.v4.app.ListFragment; public class ListContentFragment extends ListFragment { @Override public void onViewCreated(View view, Bundle savedInstanceState) { //Supress default list and empty text behavior //super.onViewCreated(view, savedInstanceState); } } 

然后将此片段(而不是推荐的list_content布局)包含到您的自定义布局中:

 ...  ... 

这样,您将获得ListFragment的全function默认行为,同时仍具有自定义布局。