Spinner 类似 widget,sdk_api 文档上面有这样一句话:
Spinner is a widget similar to a drop-down list for selecting items.
照着官网的例子,先给没用过Spinner的同志扫扫盲,step by step 吧!
1. 新建项目 SpinnerUsedResources
这个名称主要是想说明该项目,用的是现有资源,即静态创建 Spinner所需资源。
2. main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="10dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dip"
android:text="@string/planet_prompt"
/>
<Spinner
android:id="@+id/spinner"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/planet_prompt"
/>
</LinearLayout>
3. Strings.xml该文件位于项目 /res/values 下,具体代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, SpinnerUsedResourcesActivity!</string>
<string name="app_name">SpinnerUsedResources</string>
<string name="planet_prompt">Choose a planet</string>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
</resources>
说明以下,在该文件中<string-array></string-array>标签用来声明String数组,该数组的名称是planets_array(有了名字我们就可以在代码中调用它!)当然你也可以在代码中自己new String[ ] ,随你便。
另外,还可以获得数组的值:
Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);
4. Activity代码
package mark.zhang;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class SpinnerUsedResourcesActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Spinner spinner = (Spinner)findViewById(R.id.spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.planets_array,
android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new MyOnItemSelectedListener());
}
/**
* @author mark
* 内部类
*/
public class MyOnItemSelectedListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent, View view, int pos,
long id) {
Toast.makeText(
parent.getContext(),
"The planet is " + parent.getItemAtPosition(pos).toString(),
Toast.LENGTH_LONG).show();
}
public void onNothingSelected(AdapterView parent) {
// Do nothing.
}
}
}
5. 运行soory,程序异常终止!看看Log,说spinner是NullPointer!怎么可能呢?纠结了一会,Debug、看源码,都没有找到答案。呜呼!
木有办法,在main.xml文件中修改 spinner的id,然后运行,居然ok!最终,我又将main.xml文件中的spinner的id改为spinner,运行也没错。晕!
效果图:
6. 思考
既然在strings.xml文件可以声明数组,那么还有没有其它办法创建数组呢?
答案是肯定的。
在/res/values下,新建android xml文件arrays.xml。
代码内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array2">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
</resources>
注意,该数组名称是planets_array2,在SpinnerUsedResourcesActivity代码onCreate方法中作如下修改:
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.planets_array2,
android.R.layout.simple_spinner_item);
运行效果是一样的。
关于动态添加Spinner内容,关注下篇博客。
感谢:sdk-path/docs/resources/tutorials/views/hello-spinner.html