Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在动态更新的ListPreference中避免ArrayIndexOutOfBoundsException?_Android_Listpreference - Fatal编程技术网

Android 如何在动态更新的ListPreference中避免ArrayIndexOutOfBoundsException?

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

我有一个自定义的EditPreferences,它从数据库而不是默认的资源XML填充显示的列表:

@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);
    }   
}