Android 使用 Android Studio 编写的训练营书中的应用程序崩溃

Android app from bootcamp book crashes when written with Android Studio

Android Bootcamp 书中的示例应用程序是为 Eclipse 编写的,但是当我在 Android Studio 中编写它时,我看不到 Spinner 选项并且当我单击时应用程序一直崩溃查找票价,

这是应用程序在 AVD 中的样子

https://www.dropbox.com/s/k5pmw0a5gqrfbd2/Screen%20Shot%202015-03-27%20at%2012.43.06%20PM.png?dl=0

它是一个 Activity 应用程序,这里是主要应用程序 xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="net.androidbootcamp.concerttickets.Main">

<TextView android:text="Ticket Vault" android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:textSize="40sp"
    android:id="@+id/textView" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="number"
    android:ems="10"
    android:id="@+id/txtTickets"
    android:layout_below="@+id/textView"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="68sp"
    android:hint="Number of Tickets"
    android:textSize="30dp" />

<!-- no reference for the spinner here values here, they are stored at the strings.xml file that will be handled in Java -->
<Spinner
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/txtGroup"
    android:layout_below="@+id/txtTickets"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="45dp"
    android:prompt="@string/title" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:id="@+id/txtResult"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="51dp" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Find Ticket Cost"
    android:id="@+id/btnCost"
    android:layout_below="@+id/txtGroup"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="57dp"
    android:textSize="30dp" />

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true" />

这是主要的 java

package net.androidbootcamp.concerttickets;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Button;
import android.view.View;

import java.text.DecimalFormat;


public class Main extends Activity {

//declaring variables
double costPerTicket=59.99;
int numberOfTickets;
double totalCost;
String groupChoice;

@Override

//customary to launch the Activity
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // the EditTicket is stored in tickets. final , will not be changed .
    final EditText tickets=(EditText) findViewById(R.id.txtTickets);
    // the spinner is stored at group
    final Spinner group = (Spinner) findViewById(R.id.txtGroup);
    Button cost = (Button) findViewById(R.id.btnCost);
    final TextView result = ((TextView) findViewById(R.id.txtResult));
    //button onClickListener
    cost.setOnClickListener (new View.OnClickListener (){

        @Override
        public void onClick(View v){

            numberOfTickets = Integer.parseInt(tickets.getText().toString());
            totalCost = costPerTicket * numberOfTickets;
            DecimalFormat currency = new DecimalFormat("`$`###,###.##");
            groupChoice = group.getSelectedItem().toString();
            result.setText("Total Cost for "+ groupChoice + " is " + currency.format(totalCost));

        }

    });

   // final TextView result =((TextView) findViewById (R.id.txtResult));
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

这是目录,我可以看到它在抱怨结果变量,但不确定为什么不显示 Spinner:

03-26 13:01:26.120      868-868/net.androidbootcamp.concerttickets D/dalvikvm﹕ Not late-enabling CheckJNI (already on)
03-26 13:01:27.140      868-868/net.androidbootcamp.concerttickets D/﹕ HostConnection::get() New Host Connection established 0xb7c64238, tid 868
03-26 13:01:27.180      868-868/net.androidbootcamp.concerttickets W/EGL_emulation﹕ eglSurfaceAttrib not implemented
03-26 13:01:27.190      868-868/net.androidbootcamp.concerttickets D/OpenGLRenderer﹕ Enabling debug mode 0
03-26 13:01:40.370      868-868/net.androidbootcamp.concerttickets D/dalvikvm﹕ GC_FOR_ALLOC freed 73K, 5% free 3108K/3252K, paused 28ms, total 30ms
03-26 13:01:40.380      868-868/net.androidbootcamp.concerttickets I/dalvikvm-heap﹕ Grow heap (frag case) to 4.173MB for 1127536-byte allocation
03-26 13:01:40.420      868-881/net.androidbootcamp.concerttickets D/dalvikvm﹕ GC_FOR_ALLOC freed 2K, 4% free 4206K/4356K, paused 31ms, total 31ms
03-26 13:01:40.590      868-868/net.androidbootcamp.concerttickets W/EGL_emulation﹕ eglSurfaceAttrib not implemented
03-26 13:01:46.670      868-868/net.androidbootcamp.concerttickets W/InputEventReceiver﹕ Attempted to finish an input event but the input event receiver has already been disposed.
03-26 13:01:48.460      868-868/net.androidbootcamp.concerttickets W/EGL_emulation﹕ eglSurfaceAttrib not implemented
03-26 13:01:48.880      868-868/net.androidbootcamp.concerttickets W/InputEventReceiver﹕ Attempted to finish an input event but the input event receiver has already been disposed.
03-26 13:01:53.550      868-868/net.androidbootcamp.concerttickets D/AndroidRuntime﹕ Shutting down VM
03-26 13:01:53.550      868-868/net.androidbootcamp.concerttickets W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb1b05ba8)
03-26 13:01:53.560      868-868/net.androidbootcamp.concerttickets E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: net.androidbootcamp.concerttickets, PID: 868
java.lang.NullPointerException
        at net.androidbootcamp.concerttickets.Main`$`1.onClick(Main.java:46)
        at android.view.View.performClick(View.java:4438)
        at android.view.View`$`PerformClick.run(View.java:18422)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit`$`MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

这是我的字符串 xml 演唱会门票 主要

<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="title">Select Group</string>

<string-array name="Groups">
    <item>Dragonly</item>
    <item>Nine Volt</item>
    <item>Red Road</item>
</string-array>

这是我的 Android清单 xml

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".Main"
        android:label="@string/title_activity_main">
    </activity>
</application>

我们将不胜感激您的帮助

您没有在任何地方将字符串数组关联到微调器。您可以在代码中填充微调器,或者通过添加以下内容在 xml 中设置微调器的 android:entries:

android:entries="@array/Groups"

崩溃可能是由于微调器为空,如果没有为微调器设置适配器,调用 group.getSelectedItem().toString();GetSelectedItem() 将 return 为 null。

您还应该处理调用 Integer.ParseInt.

时可能抛出的 NumberFormatException