如何从strings.xml的string-array中获取Spinner选中项的value值
解决Spinner获取中item的value值问题
这个问题我之前也碰到过!默认的ArrayAdapter确实只会读取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在加载value属性,所以必须手动通过XmlPullParser来解析完整的XML结构,才能同时获取显示名称和对应的邮箱值。
内容的提问来源于stack exchange,提问作者VitoMisur
相关产品推荐
相关产品推荐

