0

我的问题是关于 OnclickListner 和 java 类的。我有一个带有两个按钮的 xml 布局;一个(单击时)触发“日期”类,另一个触发“电子邮件”类。电子邮件按钮工作正常,但是当我尝试为“日期”按钮设置点击监听器时,应用程序崩溃(触发时)。我的目标是能够单击日期按钮,显示日期选择器。这是我的代码。希望这是足够的信息,任何人都可以帮助我,谢谢大家。

XML:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="100"
android:orientation="vertical"
android:background="@color/white">

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/bgklogo3" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="Schedule Service"
    android:textSize="20sp"
    android:textStyle="bold"
    android:textColor="@color/black"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<ScrollView
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_weight="30" >



    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textColor="@color/black"
            android:text="Your Information"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <EditText
            android:id="@+id/firstName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:maxLength="20"
            android:singleLine="true"
            android:imeActionLabel="Next"
            android:hint="Enter First Name..." >


        </EditText>

        <EditText
            android:id="@+id/lastName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:imeActionLabel="Next"
            android:hint="Enter Last Name..." />

        <EditText
            android:id="@+id/Email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:imeActionLabel="Next"
            android:hint="Enter Email..."
            android:inputType="textEmailAddress" />

        <EditText
            android:id="@+id/PhoneNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:imeActionLabel="Next"
            android:hint="Enter Phone Number..."
            android:inputType="phone" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textColor="@color/black"
            android:text="Vehicle Information"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
       <!--      
         <EditText
             android:id="@+id/tYear"
             android:layout_width="155dp"
             android:layout_height="wrap_content"
             android:singleLine="true"
            android:imeActionLabel="Next"
             android:hint="What year is it?"/>

         <EditText 
             android:id="@+id/tMake"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:singleLine="true"
            android:imeActionLabel="Next"
             android:hint="What make is it?"/>

         --> 


            <Spinner
                android:id="@+id/sYear"
                android:layout_width="155dp"
                android:layout_height="wrap_content"
                android:entries="@array/entries"
                android:prompt="@string/prompt" />

            <Spinner
                android:id="@+id/sMake"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:entries="@array/entries2"
                android:prompt="@string/prompt2" >
            </Spinner>


        </LinearLayout> 

        <EditText
            android:id="@+id/Model"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:imeActionLabel="Next"
            android:hint="Enter Model..." />

        <TextView
            android:id="@+id/textView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textColor="@color/black"
            android:hint="Service Information"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textAppearance="?android:attr/textAppearanceSmall" />



        <LinearLayout
            android:id="@+id/linearLayout2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="30" >

          <!--    <EditText
                android:id="@+id/tpickDate"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:imeActionLabel="Next"
                android:hint="Enter service date..."/>
       -->


            <Button
                android:id="@+id/pickDate"
                android:layout_width="142dp"
                android:layout_height="wrap_content"
                android:text="Service Date: "
                android:onClick="onClick"/>

            <TextView
                android:id="@+id/dateDisplay"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"

                android:text="@+id/dateDisplay"
                android:textSize="20sp" />
                -->
        </LinearLayout>
      <!--   
        <EditText 
            android:id="@+id/tTime"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:imeActionLabel="Next"
            android:hint="Enter service time..." />

        <EditText 
            android:id="@+id/tNeeded"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:imeActionLabel="Next"
            android:hint="Enter service needed..." />
            --> 



        <Spinner
            android:id="@+id/sTime"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:entries="@array/entries3"
            android:prompt="@string/prompt3" />

        <Spinner
            android:id="@+id/sNeeded"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:entries="@array/entries4"
            android:prompt="@string/prompt4" />



        <EditText
            android:id="@+id/eComments"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:imeActionLabel="Next"
            android:hint="Enter Comments Here..."
            android:inputType="textMultiLine" />
    </LinearLayout>
  </ScrollView> 




<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="40"
    android:orientation="vertical" >        

     <Button
    android:id="@+id/bSentEmail"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="Submit"
    android:textSize="20dp"
    android:onClick="handleClick"
    />

</LinearLayout>


</LinearLayout>

日期类:

import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.method.KeyListener;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.Spinner;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;

public class ScheduleService extends Activity implements OnClickListener {
EditText /* serviceTime, serviceNeeded, vehicleYear, vehicleMake, */
        personsFirstName,
        personsLastName,
        personsEmail,
        personsPhone,
        comments,
        vehicleModel;
Spinner serviceTime, serviceNeeded, vehicleYear, vehicleMake;
TextView serviceDate;
String fname, lname, phoneNumber, vehicleYears, vehicleModeltrim,
        vehicleManu, serviceAppointment, serviceAppointmentTime,
        serviceTypeNeeded, extraComments, emailAdd, emailaddress, message;
Button sendEmail, PickDate ;
private TextView mDateDisplay;
 private Button mPickDate;
 private int mYear;
 private int mMonth;
 private int mDay;


 static final int DATE_DIALOG_ID = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.service);
    initialize();

    PickDate.setOnClickListener(this);


}

public void onClick(){
     //
        mDateDisplay = (TextView)  findViewById(R.id.dateDisplay);
        mPickDate = (Button) findViewById(R.id.pickDate);

        // add a click listener to the button
        mPickDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(DATE_DIALOG_ID);
            }
        });

        // get the current date
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);

        // display the current date
        updateDisplay();
    }
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this,
                        mDateSetListener,
                        mYear, mMonth, mDay);
        }
        return null;
    }

    // updates the date we display in the TextView
    private void updateDisplay() {
        mDateDisplay.setText(
            new StringBuilder()
                    // Month is 0 based so add 1
                    .append(mMonth + 1).append("-")
                    .append(mDay).append("-")
                    .append(mYear).append(" "));
    }
    // the callback received when the user "sets" the date in the dialog
    private DatePickerDialog.OnDateSetListener mDateSetListener =
            new DatePickerDialog.OnDateSetListener() {

                public void onDateSet(DatePicker view, int year,
                                      int monthOfYear, int dayOfMonth) {
                    mYear = year;
                    mMonth = monthOfYear;
                    mDay = dayOfMonth;
                    updateDisplay();
                }
    };



// Use the following commented fields for future Spinner properties
private void initialize() {
    // TODO Auto-generated method stub
    personsFirstName = (EditText) findViewById(R.id.firstName);
    personsLastName = (EditText) findViewById(R.id.lastName);
    personsEmail = (EditText) findViewById(R.id.Email);
    personsPhone = (EditText) findViewById(R.id.PhoneNumber);
    vehicleYear = (Spinner) findViewById(R.id.sYear);
    vehicleMake = (Spinner) findViewById(R.id.sMake);
    // vehicleYear = (EditText) findViewById(R.id.tYear);
    // vehicleMake = (EditText) findViewById(R.id.tMake);
    vehicleModel = (EditText) findViewById(R.id.Model);
    serviceDate = (TextView) findViewById(R.id.dateDisplay);
    serviceTime = (Spinner) findViewById(R.id.sTime);
    serviceNeeded = (Spinner) findViewById(R.id.sNeeded);
    // serviceTime = (EditText) findViewById(R.id.tTime);
    // serviceNeeded = (EditText) findViewById(R.id.tNeeded);
    comments = (EditText) findViewById(R.id.eComments);
    sendEmail = (Button) findViewById(R.id.bSentEmail);
    PickDate = (Button) findViewById(R.id.pickDate);

}

public void handleClick(View v) {

    // TODO Auto-generated method stub
    conversion();
    String emailaddress[] = { "some@email.com" };
    String message = "Please Review the following:" + '\n' + " " + '\n'
            + "First Name: " + fname + '\n' + "Last Name: " + lname + '\n'
            + "Email :" + emailAdd + '\n' + "Phone Number: " + phoneNumber
            + '\n' + "Vechile Year: " + vehicleYears + '\n'
            + "Vehicle Make: " + vehicleManu + '\n' + "Vehicle Model: "
            + vehicleModeltrim + '\n' + "Requested Service Date: "
            + serviceAppointment + '\n' + "Requested Service Time: "
            + serviceAppointmentTime + '\n' + "Service Needed: "
            + serviceTypeNeeded + '\n' + "Comments: " + extraComments;

    Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
    emailIntent.setType("vnd.android.cursor.dir/email");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
            new String[] { "some@email.com" });
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, emailaddress);
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
            "Mobile App: Schedule Service Request");
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, message);
    startActivity(Intent.createChooser(emailIntent,
            "Please select Email Client"));

}

private void conversion() {
    // TODO Auto-generated method stub
    fname = personsFirstName.getText().toString();
    lname = personsLastName.getText().toString();
    emailAdd = personsEmail.getText().toString();
    phoneNumber = personsPhone.getText().toString();

    // vehicleYears = vehicleYear.getText().toString();// Text field
    // substitute for spinner adapter
    // vehicleManu = vehicleMake.getText().toString(); // Text field
    // substitute for spinner adapter
    vehicleYears = (String) vehicleYear.getSelectedItem().toString();
    vehicleManu = (String) vehicleMake.getSelectedItem().toString();
    vehicleModeltrim = vehicleModel.getText().toString();
    serviceAppointment = serviceDate.getText().toString();
    // serviceAppointmentTime = serviceTime.getText().toString();
    // serviceTypeNeeded = serviceNeeded.getText().toString();

    serviceAppointmentTime = (String) serviceTime.getSelectedItem()
            .toString();
    serviceTypeNeeded = (String) serviceNeeded.getSelectedItem().toString();
    extraComments = comments.getText().toString();
}

public void onClick(View v) {
    // TODO Auto-generated method stub

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    finish();

}

@Override
protected void onDestroy() {
    super.onDestroy();
    {

    }

}

}

4

2 回答 2

1

你在打电话

mPickDate.setOnClickListener(this);

mPickDate = (Button) findViewById(R.id.pickDate);

这将导致 NullPointerException,从而导致崩溃。在初始化 Button 变量后设置监听器

于 2012-04-10T21:02:05.283 回答
0

您正在混合三种不同类型的onClick回调。

  • 在 XML 中,您通过名称指定将在Activity类中调用的函数。如果我使用这种方法,我会将点击指向除onClick().
  • Date活动中,您正在实施OnClickListener然后将按钮点击发送到包含活动。这将调用onClick()类底部的方法。稍后,您将 指定为OnClickListener内联定义的函数。后者我不会这样做。
  • ScheduleService活动中,您正在实施OnClickListener然后将按钮点击发送到包含活动。稍后,您实现onClick(). 这是典型的。

有关处理的更多信息onClick(),请参阅本文中的“更轻松的点击侦听器”:http: //developer.android.com/resources/articles/ui-1.6.html

于 2012-04-10T21:06:36.700 回答