7

我有一个活动,它有一个带有垂直 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。就好像每个 Fragment 都在一个 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 为您提供帮助。

4

4 回答 4

6

移除外部的 ScrollView。我有同样的问题,这为我解决了。

我还没有在文档中找到它,但显然 PreferenceFragment 在 PreferenceScreen 周围提供了自己的 ScrollView。不知何故,导致 wrap_content 的高度刚好足够显示第一个元素(例如类别标题)。

于 2014-05-02T01:26:32.777 回答
6

这个问题已经很老了,但万一其他人偶然发现了这个问题,我已经设法找到了解决方案。就像@Ewoks 提到的那样,我也必须适应一个固定的高度(在设备的不同 dpi 上并不总是能很好地发挥作用)。

但是在这段代码的帮助下,我设法使高度动态化,很好地包装了内容。

在您的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);
        }
    }

}

希望这对某人有帮助!

于 2016-03-15T13:51:13.587 回答
1

鉴于您无法删除外部 ScrollView,对我有用的是将其更改为 aandroid.support.v4.widget.NestedScrollView然后在 ActivityonCreate中运行:

findViewById(R.id.nested_scroll_view).setNestedScrollingEnabled(false);
于 2019-12-25T14:24:30.777 回答
0

尝试将每个片段中的 android:layout_weight 设置为大致每个设置列表的大小。例如

<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"/>
于 2017-07-10T17:40:02.030 回答