Android 如何在动态更新的ListPreference中避免ArrayIndexOutOfBoundsException?
我有一个自定义的EditPreferences,它从数据库而不是默认的资源XML填充显示的列表:Android 如何在动态更新的ListPreference中避免ArrayIndexOutOfBoundsException?,android,listpreference,Android,Listpreference,我有一个自定义的EditPreferences,它从数据库而不是默认的资源XML填充显示的列表: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.apppreferences); ListPreference cityPref = (ListPreference) find
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.apppreferences);
ListPreference cityPref = (ListPreference) findPreference(getString(R.string.citypref));
MySQLiteOpenHelper database = new MySQLiteOpenHelper(context);
CharSequence[] cities = database.getAllCities();
cityPref.setEntries(cities);
}
数据库维护正确(即,显示的ListPreference显示动态添加到数据库的所有条目),但当我选择刚添加的条目之一时,会出现异常:
java.lang.ArrayIndexOutOfBoundsException
at android.preference.ListPreference.onDialogClosed(ListPreference.java:264)
at android.preference.DialogPreference.onDismiss(DialogPreference.java:384)
at android.app.Dialog$ListenersHandler.handleMessage(Dialog.java:1047)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
显然,ListPreference()中有些内容超出了范围:
但我真的不想改变操作系统的代码。。。知道如何解决这个问题吗?避免意味着您需要交叉检查列表大小和索引,检查您试图访问的索引是否存在于列表中,甚至索引是否大于列表大小
int entry_size = mEntryValues.length;
if (mClickedDialogEntryIndex < entry_size) {
String value = mEntryValues[mClickedDialogEntryIndex].toString();
if (callChangeListener(value)) {
setValue(value);
}
}
int entry\u size=mEntryValues.length;
如果(mClickedDialogEntryIndex<条目大小){
String value=mEntryValues[mClickedDialogEntryIndex].toString();
if(callChangeListener(值)){
设置值(值);
}
}
您也必须打电话。两个数组的大小应该相同。因此,只需在onCreate()
方法中添加一行cityPref.setEntryValues(cities)
,就可以了
只调用
setEntries()
两种大小都不同步。因此,例外情况。mEntryValues是基代码中的私有数据成员。我甚至无法重写onDialogClosed()。这确实是问题所在(也是解决方案)。我喜欢不需要修改核心SDK行为的解决方案。:)
int entry_size = mEntryValues.length;
if (mClickedDialogEntryIndex < entry_size) {
String value = mEntryValues[mClickedDialogEntryIndex].toString();
if (callChangeListener(value)) {
setValue(value);
}
}