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

如何从strings.xml的string-array中获取Spinner选中项的value值

解决Spinner获取中item的value值问题

这个问题我之前也碰到过!默认的ArrayAdapter确实只会读取里item的显示文本,不会处理value属性,所以得手动解析XML资源来关联显示名称和邮箱值。下面给你两种可行的方案:

方案一:自定义数据类+自定义ArrayAdapter

这种方式逻辑清晰,适合后续扩展(比如要加更多字段):

1. 定义数据类

先创建一个数据类来存储显示名称和对应的邮箱:

data class EmailItem(val displayName: String, val email: String)

2. 解析资源

在Activity/Fragment中,通过XmlPullParser解析你的choose_array,把每个item的显示文本和value值存入列表:

val emailItems = mutableListOf<EmailItem>()
val parser = resources.getXml(R.array.choose_array)

try {
    var eventType = parser.eventType
    while (eventType != XmlPullParser.END_DOCUMENT) {
        // 找到每个<item>标签
        if (eventType == XmlPullParser.START_TAG && parser.name == "item") {
            // 获取value属性对应的邮箱
            val email = parser.getAttributeValue(null, "value") ?: ""
            // 获取item的显示文本
            val displayName = parser.nextText()
            emailItems.add(EmailItem(displayName, email))
        }
        eventType = parser.next()
    }
} catch (e: XmlPullParserException) {
    e.printStackTrace()
} catch (e: IOException) {
    e.printStackTrace()
}

3. 设置自定义ArrayAdapter

创建自定义Adapter来绑定数据,确保Spinner显示的是名称:

val adapter = object : ArrayAdapter<EmailItem>(this, android.R.layout.simple_spinner_item, emailItems) {
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = super.getView(position, convertView, parent)
        val textView = view.findViewById<TextView>(android.R.id.text1)
        textView.text = emailItems[position].displayName
        return view
    }

    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = super.getDropDownView(position, convertView, parent)
        val textView = view.findViewById<TextView>(android.R.id.text1)
        textView.text = emailItems[position].displayName
        return view
    }
}
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
yourSpinner.adapter = adapter

4. 获取选中项的邮箱值

设置选中监听,直接从emailItems列表中取对应位置的邮箱:

yourSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        val selectedEmail = emailItems[position].email
        // 这里就拿到了选中项对应的邮箱值,后续可以直接使用
    }

    override fun onNothingSelected(parent: AdapterView<*>?) {
        // 处理未选中的情况(比如默认提示项)
    }
}

方案二:使用SimpleAdapter(无需自定义数据类)

如果不需要扩展字段,用SimpleAdapter更快捷,通过HashMap存储键值对:

1. 解析为HashMap列表

val dataList = mutableListOf<HashMap<String, String>>()
val parser = resources.getXml(R.array.choose_array)

try {
    var eventType = parser.eventType
    while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.START_TAG && parser.name == "item") {
            val itemMap = HashMap<String, String>()
            itemMap["displayName"] = parser.nextText()
            itemMap["email"] = parser.getAttributeValue(null, "value") ?: ""
            dataList.add(itemMap)
        }
        eventType = parser.next()
    }
} catch (e: Exception) {
    e.printStackTrace()
}

2. 设置SimpleAdapter

val adapter = SimpleAdapter(
    this,
    dataList,
    android.R.layout.simple_spinner_item,
    arrayOf("displayName"), // 要显示的字段键名
    intArrayOf(android.R.id.text1) // 对应布局中的TextView ID
)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
yourSpinner.adapter = adapter

3. 获取选中项的邮箱值

yourSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        val selectedMap = dataList[position]
        val selectedEmail = selectedMap["email"]
        // 使用邮箱值
    }

    override fun onNothingSelected(parent: AdapterView<*>?) {}
}

关键说明

为什么默认拿不到value值?因为Android系统的ArrayAdapter在加载时,只会提取item节点的文本内容,不会解析item的value属性,所以必须手动通过XmlPullParser来解析完整的XML结构,才能同时获取显示名称和对应的邮箱值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:47:18