如何正确引用 Spinner 条目?

How to refer a Spinner entry correctly?

我一直在为 Android 制作一个应用程序,它使用 Spinner 列表来显示几个城市的名称。我需要程序更改微调器正下方的 TextView 以显示所选项目在数组中的位置。我为相同的

写了下面的代码
public class MainScreen extends Activity {
String[] cityArray = { "Agra ", "Ahmedabad", "Alappuzha", "Amritsar"};
Spinner list = (Spinner) findViewById(R.id.ListView1);
TextView nam = (TextView)findViewById(R.id.textView2);

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main_screen);

      ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.activity_listview, cityArray);
      list.setAdapter(adapter);


list.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parentView, View view,int position, long id) 
    {
        nam.setText(list.getSelectedItemPosition());
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        nam.setText("None Selected");
    }

});
}
}

程序运行没有错误,但应用程序只是在打开后立即强制关闭。

Logcat:

04-10 08:49:30.423: I/dalvikvm(561): threadid=3: reacting to signal 3
04-10 08:49:30.723: I/dalvikvm(561): Wrote stack traces to '/data/anr/traces.txt'
04-10 08:49:30.783: I/dalvikvm(561): threadid=3: reacting to signal 3
04-10 08:49:30.823: D/AndroidRuntime(561): Shutting down VM
04-10 08:49:30.823: W/dalvikvm(561): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
04-10 08:49:30.844: E/AndroidRuntime(561): FATAL EXCEPTION: main
04-10 08:49:30.844: E/AndroidRuntime(561): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.droidrish.droidweather/com.droidrish.droidweather.MainScreen}: java.lang.NullPointerException
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880)
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.app.ActivityThread.access0(ActivityThread.java:123)
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.os.Handler.dispatchMessage(Handler.java:99)
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.os.Looper.loop(Looper.java:137)
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.app.ActivityThread.main(ActivityThread.java:4424)
04-10 08:49:30.844: E/AndroidRuntime(561):  at java.lang.reflect.Method.invokeNative(Native Method)
04-10 08:49:30.844: E/AndroidRuntime(561):  at java.lang.reflect.Method.invoke(Method.java:511)
04-10 08:49:30.844: E/AndroidRuntime(561):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-10 08:49:30.844: E/AndroidRuntime(561):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-10 08:49:30.844: E/AndroidRuntime(561):  at dalvik.system.NativeStart.main(Native Method)
04-10 08:49:30.844: E/AndroidRuntime(561): Caused by: java.lang.NullPointerException
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.app.Activity.findViewById(Activity.java:1794)
04-10 08:49:30.844: E/AndroidRuntime(561):  at com.droidrish.droidweather.MainScreen.<init>(MainScreen.java:15)
04-10 08:49:30.844: E/AndroidRuntime(561):  at java.lang.Class.newInstanceImpl(Native Method)
04-10 08:49:30.844: E/AndroidRuntime(561):  at java.lang.Class.newInstance(Class.java:1319)
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
04-10 08:49:30.844: E/AndroidRuntime(561):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871)
04-10 08:49:30.844: E/AndroidRuntime(561):  ... 11 more
04-10 08:49:30.844: I/dalvikvm(561): Wrote stack traces to '/data/anr/traces.txt'
04-10 08:49:31.416: I/dalvikvm(561): threadid=3: reacting to signal 3
04-10 08:49:31.443: I/dalvikvm(561): Wrote stack traces to '/data/anr/traces.txt'
04-10 08:49:31.583: I/dalvikvm(561): threadid=3: reacting to signal 3
04-10 08:49:31.603: I/dalvikvm(561): Wrote stack traces to '/data/anr/traces.txt'
04-10 08:49:33.722: I/Process(561): Sending signal. PID: 561 SIG: 9

我使用 OnItemSelected 侦听器的方式是否正确?我期待程序将 TextView 的文本更改为 Spinner 中项目的位置。

这是问题所在:

Spinner list = (Spinner) findViewById(R.id.ListView1);
TextView nam = (TextView)findViewById(R.id.textView2);

将这些移动到 onCreate() 下方的 setContentView()

Spinner 和 textview 应该像这样在 onCreate 中初始化:

public class MainScreen extends Activity {

      String[] cityArray = { "Agra ", "Ahmedabad", "Alappuzha", "Amritsar"};
      Spinner list;
      TextView nam;

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main_screen);

      list = (Spinner)findViewById(R.id.ListView1);
      nam = (TextView)findViewById(R.id.textView2);

然后更改为:

 nam.setText(list.getSelectedItemPosition());

至:

nam.setText(list.getSelectedItem().toString());

如果您只需要索引,请执行以下操作:

nam.setText(String.valueOf(list.getSelectedItemPosition()));