首先,我使用的是Android兼容性库V4 rev.3,用于我的1.6(甜甜圈)
首次创建ListFragment时,它会显示一个不确定的进度指示器,直到你使用setListAdabpter()。根据ListFragment.onCreateView的文档,如果我想使用自定义布局:
如果您使用自己的自定义内容覆盖此方法, 考虑包括标准布局{@link 你的布局文件中有android.R.layout#list_content} 继续保留ListFragment的所有标准行为。在 特别是,这是目前内置的唯一方法 显示不确定的进展状态。
问题是,当我进入我的布局文件并尝试:
<include layout="@android:layout/list_content" ...>
它(eclipse)告诉我
资源不公开。 (在'layout'中,值为'@ android:layout / list_content')。
我认为这意味着我的V4源代码中不存在list_content.xml
。这是正确的,因为根据API v11中出现的文档。
我只是假设它存在于兼容性库源中,不知道它是否...
我能看到的唯一其他解决方案是挖掘android的API V11源代码并复制并粘贴list_content.xml
。但是现在我想避免这个hackery。这是唯一的解决方案吗?
答案 0 :(得分:9)
兼容性库中包含的ListFragment
似乎没有像真实那样使用该布局(list_content)。这可能是因为它以jar形式提供,并且无法打包资源。以下是其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”;)
答案 1 :(得分:2)
我很失望地看到使用支持库无法使用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曾经是我的自定义布局。
答案 2 :(得分:1)
使用兼容性库时,将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布局)包含到自定义布局中:
...
<fragment class="com.example.app.ListContentFragment"
android:layout_weight ="1"
android:layout_width ="fill_parent"
android:layout_height ="0dip" />
...
这样,您将获得ListFragment的全功能默认行为,同时仍然具有自定义布局。