Android中的动态ListPreference

44

如何在安卓中生成动态的 listPreference? 我想获取所有的 WiFi 接入点,并使用 Preference Activity 制作一个列表(即使用 listpreference 制作一个列表)。 如何实现这个功能?


3
考虑到项目将是动态的,仅在onCreate中设置项目是不够的。当单击ListPreference时,还需要更新值:https://dev59.com/nWw15IYBdhLWcg3wpNcB#13828912 - ccpizza
3个回答

27

在Android中,每个XML元素都可以通过编程创建,因为元素名称也是Java类。 因此,您可以在代码中创建ListPreference:

CharSequence[] entries = { "One", "Two", "Three" };
CharSequence[] entryValues = { "1", "2", "3" };
ListPreference lp = new ListPreference(this);
lp.setEntries(entries);
lp.setEntryValues(entryValues);

你可以选择在XML中创建它,然后在代码中添加条目/条目值:

CharSequence[] entries = { "One", "Two", "Three" };
CharSequence[] entryValues = { "1", "2", "3" };
ListPreference lp = (ListPreference)findPreference("list_key_as_defined_in_xml");
lp.setEntries(entries);
lp.setEntryValues(entryValues);

8
findViewById 适用于视图。ListPreference 不是视图,所以第二个示例似乎无法工作。不能强制转换。 - Spacen Jasset
findPreference 应该被使用,而不是 findViewById。然而,在 Honeycomb 中,findPreference 已经被弃用。 - Greg Dan

26
为创建动态列表偏好设置,您需要创建一个偏好设置活动(即扩展活动PreferenceActivity)。
以下代码可用于动态创建列表:
// 根
PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
dialogBasedPrefCat.setTitle("类别标题");
root.addPreference(dialogBasedPrefCat); //添加一个类别
// 类别下的列表偏好设置 ListPreference listPref = new ListPreference(this); listPref.setKey("keyName"); //引用以获取偏好值 listPref.setEntries("值数组"); listPref.setEntryValues("项目值数组"); listPref.setDialogTitle("对话框标题"); listPref.setTitle("标题"); listPref.setSummary("摘要"); dialogBasedPrefCat.addPreference(listPref); //添加到类别下
return root;
希望这有助于得到一个想法... 编辑: 像这样创建和添加CharSequence[]的值:
CharSequence[] cs = new String[]{"myValue"};

6
请参考以下动态创建其他类型的偏好设置的示例代码:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/preference/PreferencesFromCode.html - Boris van Schooten
getEntries和getEntryValues都已经过时了,这有点奇怪,但我相信一定有充分的理由。不过这是一个很好的解决方案。 - Malachi
1
Boris - 你的链接无效:它只是带我到了下载示例索引。然而,当我在我的下载示例上悬停你的链接时,我按照指示找到了它。(对于其他人:从android-sdk\samples\android-<version>\ApiDemos开始,然后按照Boris的路径继续) - Jeff G
样例路径:sdk\samples\android-21\legacy\ApiDemos\src\com\example\android\apis\preference - Warpzit

0

这种极简技术适用于两种环境。

在preferences.xml文件中。

<!-- NB: Dynamic array insertion for 'entries'/'entryValues' -->
<ListPreference
    android:key="xyzzy"
    android:title="..."
    android:summary="..."
    android:numeric="integer"
    android:defaultValue="0"
    android:layout="?PrefLayoutDtl" 
/>

PreferenceFragment.onCreate()
addPreferencesFromResource(R.xml.preferences);
expand_xyzzy((ListPreference)findPreference("xyzzy"));

其他地方

public static Preference expand_xyzzy (ListPreference pref) {
    if (pref == null) return pref;
    pref.setEntries(new String["one","two","three];
    pref.setEntryValues(new String["0","1","2"]);
    return pref;
}

注:
(a) XML 是自文档化的,可能比动态首选项创建更好的选择。
(b) 不使用 PreferenceActivity 启动您的PreferenceFragment 可以轻松地让您做到这一点:

image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接