探索Android应用开发(八)
学习目标:
- 引入Spinner
学习目的:
- 获取Spinner的Key和Value
学习收获:
在Android给出的示例文档中,我们会看到它是如下使用Spinner的:
Spinner s = (Spinner) findViewById(R.id.spinner); ArrayAdapter adapter = ArrayAdapter.createFromResource( this, R.array.planets, android.R.layout.simple_spinner_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); s.setAdapter(adapter); |
当然,这要求在res/values/目录下要有arrays.xml,内容如下:
Mercury Venus Earth |
这样,呈现给用户的就是Mercury、Venus、Earth组成的一个列表,在程序中通过如下方式获取用户选择的值:
String type = mTypeSpinner.getSelectedItem().toString(); |
如果用户选择Venus,则type的值就是Venus。但是这样便会产生一个问题,我们展现给用户是字面值,我们需要的是实际值。例如我们在后台可能为每个planet建立一个编号,在前台视图中根据用户的Locale显式不同的文字,例如当中文简体用户浏览时,显现为“地球”,当英文用户浏览时,展现为 “Earth”。这种效果就好比是HTML中的Select的option元素。那么接下来,就对这个问题探索一下解决方法。
通过SDK Document的查询,可以看到ArrayAdapter有这么两个构造方法:ArrayAdapter(Context context, int textViewResourceId, T[] objects)和ArrayAdapter(Context context, int textViewResourceId, List objects),什么是textViewResourceId呢?就是上面的 android.R.layout.simple_spinner_item。
这两个构造方法里,都有泛型,是不是意味着我们可以把自己的对象放到里面去,然后通过某种方法直接获得用户选中的那个对方呢?我尝试采用了如下的代码:
List typeList = typeDb.fetchTypes(); ArrayAdapter arrAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, typeList); arrAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mTypeSpinner = (Spinner) this.findViewById(R.id.type); mTypeSpinner.setAdapter(arrAdapter); |
然后使用如下代码获取用户选中的那个对象的一个属性
PurseType purseType = (PurseType) mTypeSpinner.getSelectedItem(); String type = purseType.getId(); |
代码执行之后,证明上述猜想是正确的。