问题
我尝试创建一个占据当前PreferenceScreen整个高度的自定义首选项。我的偏好在概念上类似于Wi-Fi选择屏幕。它异步加载数据并将其添加到可能选项的ListView中。为了与Wi-Fi屏幕保持一致,我希望推出占据整个屏幕的独立偏好活动。我不想使用像ListPreference这样的对话框,因为数据是异步加载的,并且它不会与Wi-Fi屏幕保持一致。
方法1
我的第一种方法是使用PreferenceFragment加载只有一个子偏好的PreferenceScreen。这有一个值得注意的问题,即我的自定义首选项被推送到单个列表视图选项中:
我的首选项正在被切断,因为PreferenceScreen只让它占据了屏幕的那一小部分。看起来PreferenceScreen实际上只是使用ListView启动单个活动,该活动会使PreferenceScreen的子首选项膨胀。我尝试只是继承PreferenceScreen来改变ListView显示我的自定义首选项的方式;但是,看起来PreferenceScreen是最终的。我也无法仅根据我偏好的XML或java代码成功操作自定义首选项的高度。我可以按照this post中的建议部分增加高度;然而,我永远无法让它占据整个屏幕的空间。这是我的偏好视图的当前XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/widget_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="16dp"
android:layout_centerInParent="true">
<ListView
android:id="@+id/server_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"/>
</RelativeLayout>
方法2
我的下一个方法是创建了一个自定义活动,它可以根据我的需要夸大某些视图。这里的问题是我无法弄清楚如何将自定义视图直接绑定到首选项系统中。看起来PreferenceActivity和PreferenceFragment都希望您夸大以PreferenceScreen为根的层次结构。似乎无论我做什么,如果我尝试使用它,我会遇到问题,如方法1中所见。这意味着我实际保存偏好数据的唯一方法是在我的活动开始,退出等时手动保存,加载和操纵用户偏好数据。这似乎是一个相当糟糕的选择,因为我创造了一个更糟糕的现有PreferenceActivity和PreferenceFragment类的版本。
话虽这么说,我的偏好最终将保存三个离散的键值对,即使用户最终只进行一次选择。我的情况可能有所不同,值得我自己编写自定义代码。
未来方向