You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ListPreference索引能否为负?为何需判断prefIndex≥0及触发场景?

关于ListPreference的findIndexOfValue返回-1的原因分析

这个问题问得很到位!咱们一步步来拆解清楚:

首先明确:findIndexOfValue()确实有可能返回-1(也就是索引小于0),而且这种情况并不少见,下面就说说具体场景:

什么时候会出现prefIndex < 0?

  • 传入的value不在ListPreference的entryValues列表中:
    ListPreference的核心是entries(显示给用户的标签)和entryValues(对应存储的实际值)的配对关系。如果传入的value(比如从SharedPreferences里读取的内容)不在entryValues数组里,findIndexOfValue()就找不到匹配项,直接返回-1。
    常见场景比如:你手动修改了SharedPreferences文件里的对应值、代码里误写入了一个不在预设选项里的value,或者后续更新APP时修改了entryValues但旧的存储值还没同步更新。

  • ListPreference的entryValues未正确初始化:
    如果你的ListPreference没有设置entryValues(比如XML里漏写了android:entryValues属性,或者代码里没给它赋值),或者entryValues是null/空数组,那不管你传什么value,findIndexOfValue()都会返回-1。

  • 传入的value为null且entryValues中没有null项:
    如果读取到的value是null,而你的entryValues数组里没有对应的null元素,同样会返回-1。

为什么必须判断prefIndex >= 0?

很简单:如果直接用-1作为索引去访问listPreference.getEntries()数组,会立刻抛出ArrayIndexOutOfBoundsException(数组越界异常),导致APP崩溃。判断prefIndex >=0是为了确保我们确实找到了对应的选项,再去获取对应的标签设置摘要,避免程序出错。

举个例子,你的代码里如果跳过这个判断直接执行设置,当value不匹配时,就会触发崩溃,所以这个判断是必要的防御性编程手段。

内容的提问来源于stack exchange,提问作者Joif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:15:58