Spinner(1): 由SDK引发的问题

来源:互联网 发布:中超后卫数据 编辑:程序博客网 时间:2024/05/24 05:53

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 {@Overridepublic 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


原创粉丝点击