探索Android应用开发(八)

android

android

学习目标:

  1. 引入Spinner

学习目的:

  1. 获取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();

代码执行之后,证明上述猜想是正确的。

Leave a comment

Your comment