我的活动有一个带有垂直LinearLayout的ScrollView,它有两个片段,它们是PreferenceFragment实例,如下面的布局文件所示:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content"
android:layout_width="match_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context="com.foo.app.SettingsActivity">
<fragment
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="com.foo.app.SettingsFragment"
android:id="@+id/fragment_settings"/>
<fragment
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="com.foo.app.NotificationSettingsFragment"
android:id="@+id/fragment_notification_settings"/>
</LinearLayout>
问题是这两个片段只显示了他们的PreferenceCategory标题,而实际的片段UI是零高度且不可见。奇怪的是,可以单独滚动每个片段并查看丢失的片段UI。就像每个片段都在ScrollView中一样。
我期望将两个片段的大小设置为包装其内容,并且有一个垂直滑块可以滚动包含两个片段的LinearLayout。
如果它是相关的,两个片段扩展android.preference.PreferenceFragment并且不在布局文件中定义它们的布局。相反,他们按如下方式加载他们的Preference UI:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.pref_notification);
}
TIA求助。
答案 0 :(得分:6)
删除外部ScrollView。我遇到了同样的问题,并为我解决了这个问题。
我还没有在文档中找到它,但显然PreferenceFragment在PreferenceScreen周围提供了自己的ScrollView。以某种方式导致wrap_content高度足以显示第一个元素(例如类别标题)。
答案 1 :(得分:5)
这个问题已经过时了,但万一其他人偶然发现了这个问题,我已经设法找到了解决方案。就像@Ewoks提到的那样,我也必须适应一个固定的高度(这并不总能很好地适应不同设备的dpi)。
但是在this code的帮助下,我设法使高度变得动态,这很好地包装了内容。
在PreferenceFragment
课程中执行以下操作:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getView() != null) {
ListView listView = (ListView) getView().findViewById(android.R.id.list);
Adapter adapter = listView.getAdapter();
if (adapter != null) {
int height = 0;
//int height = listView.getPaddingTop() + listView.getPaddingBottom();
for (int i = 0; i < adapter.getCount(); i++) {
View item = adapter.getView(i, null, listView);
item.measure(0, 0);
height += item.getMeasuredHeight();
}
FrameLayout frame = (FrameLayout) getActivity().findViewById(R.id.content_frame); //Modify this for your fragment
ViewGroup.LayoutParams param = frame.getLayoutParams();
param.height = height + (listView.getDividerHeight() * adapter.getCount());
frame.setLayoutParams(param);
}
}
}
希望这有助于某人!
答案 2 :(得分:0)
尝试将每个片段中的android:layout_weight设置为大致每个设置列表的大小。 E.g。
<fragment
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.3"
android:name="com.foo.app.SettingsFragment"
android:id="@+id/fragment_settings"/>
<fragment
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.7"
android:name="com.foo.app.NotificationSettingsFragment"
android:id="@+id/fragment_notification_settings"/>
答案 3 :(得分:0)
鉴于您无法删除外部ScrollView,对我有用的是将其更改为android.support.v4.widget.NestedScrollView
,然后在Activity的onCreate
中运行:
findViewById(R.id.nested_scroll_view).setNestedScrollingEnabled(false);