Android 如何按显示值对ListPreference排序
我正在从XML文件创建首选项。从preferences活动的Android 如何按显示值对ListPreference排序,android,sorting,nullpointerexception,listpreference,Android,Sorting,Nullpointerexception,Listpreference,我正在从XML文件创建首选项。从preferences活动的onCreate()调用的以下代码应根据显示给用户的标签按字母顺序对显示项进行排序 private void sortListPreferenceByEntries(String preferenceKey) { ListPreference preference = (ListPreference) findPreference(preferenceKey); Iterator<CharSequence> labe
onCreate()
调用的以下代码应根据显示给用户的标签按字母顺序对显示项进行排序
private void sortListPreferenceByEntries(String preferenceKey) {
ListPreference preference = (ListPreference) findPreference(preferenceKey);
Iterator<CharSequence> labels = Arrays.asList(preference.getEntries()).iterator();
Iterator<CharSequence> keys = Arrays.asList(preference.getEntryValues()).iterator();
Collator sortRules = Collator.getInstance(getResources().getConfiguration().locale);
sortRules.setStrength(Collator.PRIMARY);
TreeMap<CharSequence, CharSequence> sorter = new TreeMap<>(sortRules);
int size = 0;
while (labels.hasNext() && keys.hasNext()) {
sorter.put(labels.next(), keys.next());
size++;
}
CharSequence[] sortedLabels = new CharSequence[size];
CharSequence[] sortedValues = new CharSequence[size];
Iterator<Map.Entry<CharSequence, CharSequence>> entryIterator = sorter.entrySet().iterator();
if (entryIterator.hasNext()) {
Map.Entry<CharSequence, CharSequence> entry = entryIterator.next();
for (int i = 0; entryIterator.hasNext() && i < size; entry = entryIterator.next(), i++) {
sortedLabels[i] = entry.getKey();
sortedValues[i] = entry.getValue();
}
}
preference.setEntries(sortedLabels);
preference.setEntryValues(sortedValues);
}
没有对元素进行排序,应用程序是完全稳定的。与我在stacktrace中发现的其他情况不同,我不尝试使用int
s作为输入值。有什么不对劲?我还可以验证被写回的新数组是否与最初从getter检索到的数组具有相同的长度(在我的例子中是118个条目)。我还尝试将新的显示顺序重新输入到原始数组中,如下所示:
System.arraycopy(sortedLabels, 0, preference.getEntries(), 0, sortedLabels.length);
System.arraycopy(sortedValues, 0, preference.getEntryValues(), 0, sortedValues.length);
但结果是一样的。我真的不知道我错过了什么。任何帮助都将不胜感激
可能有关联,但也没有答案
编辑:根据要求,这里有一个完整的应用程序,可复制错误: AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.example.appName">
<application android:allowBackup="true" android:label="App-Name"
android:icon="@mipmap/ic_launcher" android:theme="@android:style/Theme.Black">
<activity
android:name="org.example.appName.SettingsActivity"
android:theme="@android:style/Theme.Black.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="caption">
<ListPreference
android:entries="@array/mode1_options"
android:entryValues="@array/mode1_values"
android:key="mode1"
android:summary="Change mode 1"
android:title="Mode 1" />
<ListPreference
android:entries="@array/mode2_options"
android:entryValues="@array/mode2_values"
android:key="mode2"
android:summary="Change mode 2"
android:title="Mode 2" />
<ListPreference
android:entries="@array/mode3_options"
android:entryValues="@array/mode3_values"
android:key="mode3"
android:summary="Change mode 3"
android:title="Mode 3" />
<ListPreference
android:entries="@array/mode4_options"
android:entryValues="@array/mode4_values"
android:key="mode4"
android:summary="Change mode 4"
android:title="Mode 4" />
<ListPreference
android:entries="@array/mode5_options"
android:entryValues="@array/mode5_values"
android:key="mode5"
android:summary="Change mode 5"
android:title="Mode 5" />
</PreferenceCategory>
<PreferenceCategory android:title="caption">
<EditTextPreference
android:key="input1"
android:title="Input text" />
<ListPreference
android:entries="@array/mode6_options"
android:entryValues="@array/mode6_values"
android:key="mode6"
android:summary="Change mode 6"
android:title="Mode 6" />
<CheckBoxPreference
android:key="option1"
android:summary="Change option 1"
android:title="Option 1" />
<CheckBoxPreference
android:key="option2"
android:summary="Change option 2"
android:title="Option 2" />
<ListPreference
android:entries="@array/language_options"
android:entryValues="@array/language_values"
android:key="language"
android:summary="To demonstrate the problem"
android:title="Use this menu" />
<CheckBoxPreference
android:key="option3"
android:summary="Change option 3"
android:title="Option 3" />
</PreferenceCategory>
<PreferenceCategory android:title="caption">
<CheckBoxPreference
android:defaultValue="true"
android:key="option4"
android:summary="Change option 4"
android:title="Option 4" />
<CheckBoxPreference
android:defaultValue="false"
android:key="option5"
android:summary="Change option 5"
android:title="Option 5" />
</PreferenceCategory>
</PreferenceScreen>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="mode1_options">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode1_values" translatable="false">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode2_options">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode2_values" translatable="false">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode3_options">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode3_values" translatable="false">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode4_options">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode4_values" translatable="false">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode5_options">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode5_values" translatable="false">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="language_options">
<item>Oromo</item>
<item>Afrikaans</item>
<item>Albanian</item>
<item>Asturian</item>
<item>Aymara</item>
<item>Azerbaijani, Latin script</item>
<item>Balinese</item>
<item>Basque</item>
<item>Belarusian</item>
<item>Bemba</item>
<item>Bikol</item>
<item>Bislama</item>
<item>Bosnian, Cyrillic script</item>
<item>Bosnian, Latin script</item>
<item>Brazilian Portuguese</item>
<item>Breton</item>
<item>Bulgarian</item>
<item>Catalan</item>
<item>Chamorro</item>
<item>Corsican</item>
<item>Croatian</item>
<item>Czech</item>
<item>Danish</item>
<item>Dutch</item>
<item>English</item>
<item>Esperanto</item>
<item>Estonian</item>
<item>Faeroese</item>
<item>Fijian</item>
<item>Finnish</item>
<item>French</item>
<item>Frisian</item>
<item>Friulian</item>
<item>Galician</item>
<item>Luganda</item>
<item>German</item>
<item>Greek</item>
<item>Greenlandic</item>
<item>Haitian Creole</item>
<item>Hani</item>
<item>Hiligaynon</item>
<item>Hungarian</item>
<item>Icelandic</item>
<item>Ido</item>
<item>Ilocano</item>
<item>Indonesian</item>
<item>Interlingua</item>
<item>Irish</item>
<item>Italian</item>
<item>Javanese</item>
<item>Kapampangan</item>
<item>Kazakh</item>
<item>Kongo</item>
<item>Kinyarwanda</item>
<item>Kurdish</item>
<item>Latin</item>
<item>Latvian</item>
<item>Lithuanian</item>
<item>Luba-Kasai</item>
<item>Luxembourgish</item>
<item>Macedonian</item>
<item>Madurese</item>
<item>Malagasy</item>
<item>Malay</item>
<item>Maltese</item>
<item>Manx</item>
<item>Maori</item>
<item>Mayan</item>
<item>Mexican Spanish</item>
<item>Minangkabau</item>
<item>Mongolian</item>
<item>Nahuatl</item>
<item>none</item>
<item>Norwegian</item>
<item>Nyanja</item>
<item>Nynorsk</item>
<item>Papiamento</item>
<item>Nigerian Pidgin</item>
<item>English-based pidgin</item>
<item>Polish</item>
<item>Portuguese</item>
<item>Provençal</item>
<item>Quechua</item>
<item>Rhaeto-Romance</item>
<item>Romanian</item>
<item>Rundi</item>
<item>Russian</item>
<item>Samoan</item>
<item>Sardinian</item>
<item>Scottish Gaelic</item>
<item>Serbian, Cyrillic script</item>
<item>Serbian, Latin script</item>
<item>Shona</item>
<item>Slovak</item>
<item>Slovene</item>
<item>Somali</item>
<item>Sotho</item>
<item>Spanish</item>
<item>Sundanese</item>
<item>Swahili</item>
<item>Swedish</item>
<item>Swiss German</item>
<item>Tagalog</item>
<item>Tahitian</item>
<item>Tatar</item>
<item>Tetum</item>
<item>Tongan</item>
<item>Tswana</item>
<item>Turkish</item>
<item>Turkmen</item>
<item>Ukrainian</item>
<item>Uzbek, Latin script</item>
<item>Waray-Waray</item>
<item>Welsh</item>
<item>Wolof</item>
<item>Xhosa</item>
<item>Zapotec</item>
<item>Zulu</item>
</string-array>
<string-array name="language_values" translatable="false">
<item>Afaan</item>
<item>Afrikaans</item>
<item>Albanian</item>
<item>Asturian</item>
<item>Aymara</item>
<item>Azeri_Latin</item>
<item>Balines</item>
<item>Basque</item>
<item>Belrusian</item>
<item>Bemba</item>
<item>Bikol</item>
<item>Bislama</item>
<item>Bosnian_Cyrillic</item>
<item>Bosnian_Latin</item>
<item>Brazilian</item>
<item>Breton</item>
<item>Bulgarian</item>
<item>Catalan</item>
<item>Chamorro</item>
<item>Corsican</item>
<item>Croatian</item>
<item>Czech</item>
<item>Danish</item>
<item>Dutch</item>
<item>English</item>
<item>Esperanto</item>
<item>Estonian</item>
<item>Faeroese</item>
<item>Fijian</item>
<item>Finnish</item>
<item>French</item>
<item>Frisian</item>
<item>Friulian</item>
<item>Galician</item>
<item>Ganda</item>
<item>German</item>
<item>Greek</item>
<item>Greenlandic</item>
<item>Haitian_Creole</item>
<item>Hani</item>
<item>Hiligaynon</item>
<item>Hungarian</item>
<item>Icelandic</item>
<item>Ido</item>
<item>Ilocano</item>
<item>Indonesian</item>
<item>Interlingua</item>
<item>Irish_Gaelic</item>
<item>Italian</item>
<item>Javanese</item>
<item>Kapampangan</item>
<item>Kazakh</item>
<item>Kicongo</item>
<item>Kinyarwanda</item>
<item>Kurdish</item>
<item>Latin</item>
<item>Latvian</item>
<item>Lithuanian</item>
<item>Luba</item>
<item>Luxemb</item>
<item>Macedonian</item>
<item>Madurese</item>
<item>Malagasy</item>
<item>Malay</item>
<item>Maltese</item>
<item>Manx</item>
<item>Maori</item>
<item>Mayan</item>
<item>Mexican</item>
<item>Minankabaw</item>
<item>Mongol</item>
<item>Nahuatl</item>
<item>None</item>
<item>Norwegian</item>
<item>Nyanja</item>
<item>Nynorsk</item>
<item>Papiamento</item>
<item>Pidgin_nigeria</item>
<item>PidginEnglish</item>
<item>Polish</item>
<item>Portuguese</item>
<item>Provencal</item>
<item>Quechua</item>
<item>Rhaeto_Roman</item>
<item>Romanian</item>
<item>Rundi</item>
<item>Russian</item>
<item>Samoan</item>
<item>Sardinian</item>
<item>Scottish_Gaelic</item>
<item>Serbian</item>
<item>Serbian_Latin</item>
<item>Shona</item>
<item>Slovak</item>
<item>Slovenian</item>
<item>Somali</item>
<item>Sotho</item>
<item>Spanish</item>
<item>Sundanese</item>
<item>Swahili</item>
<item>Swedish</item>
<item>Swiss_German</item>
<item>Tagalog</item>
<item>Tahitian</item>
<item>Tatar</item>
<item>Tetum</item>
<item>Tongan</item>
<item>Tswana</item>
<item>Turkish</item>
<item>Turkmen</item>
<item>Ukrainian</item>
<item>Uzbek_Latin</item>
<item>Waray</item>
<item>Welsh</item>
<item>Wolof</item>
<item>Xhosa</item>
<item>Zapotec</item>
<item>Zulu</item>
</string-array>
<string-array name="mode6_options">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
<string-array name="mode6_values" translatable="false">
<item>Option 1</item>
<item>Option 2</item>
<item>Option 3</item>
</string-array>
</resources>
菜单按预期工作,不会崩溃。因此,悬而未决的问题仍然存在:如何以应用程序继续工作的方式对菜单进行排序(与未排序的菜单一样)?您的i
for (int i = 0; entryIterator.hasNext() && i < size; entry = entryIterator.next(), i++) {
for(int i=0;entryIterator.hasNext()&&i
是错误的。如果您的大小为15
,实际上您将0
迭代到13
,最后一个(14
)保留为null您的i
for (int i = 0; entryIterator.hasNext() && i < size; entry = entryIterator.next(), i++) {
for(int i=0;entryIterator.hasNext()&&i
是错误的。如果您的大小为15
,则实际上您迭代了0
到13
,最后一个(14
)is leftnull
包括产生错误的代码,否则您希望我们如何调试它?@Marcus您能重现这个问题吗?我做了一些研究,问题表明引发异常是因为您的数组不是字符串数组
类型。但当我检查您的代码时,我可以看出它们是。我记得不久前在我的一个应用程序上遇到过这个问题。你能尝试使AS缓存无效吗?如果我没有弄错你的想法,它似乎也不起作用。顺便说一句,我现在使用一种使entryValues保持不变的解决方法。包括产生错误的代码,你希望我们如何调试它?@Marcus can you reproduce the problem?我做了一些研究,问题表明引发异常是因为您的数组不是字符串数组
类型。但当我检查您的代码时,我可以看出它们是。我记得不久前在我的一个应用程序上遇到过这个问题。您是否可以尝试使as缓存无效?如果我如果你的想法是对的,它似乎也不起作用。顺便说一句,我现在使用一种让entryValues保持不变的解决方法。
// sortListPreferenceByEntries("language");
for (int i = 0; entryIterator.hasNext() && i < size; entry = entryIterator.next(), i++) {