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

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


©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页