My question is in reference to the OnclickListner and java classes. I have an xml layout with two buttons; one (when clicked) triggers the "date" class, the other triggers the "email" class. The Email button is working fine, however when I try to set an on click listener to the "date" button, the app crashes(When Triggered). My goal is to be able to click the date button, display the datepicker. Here is my code. Hopefully this is enough information for anyone to assist me, Thanks everyone.
我的问题是参考OnclickListner和java类。我有一个带有两个按钮的xml布局;一个(点击时)触发“日期”类,另一个触发“电子邮件”类。 “电子邮件”按钮工作正常,但是当我尝试将“点击”侦听器设置为“日期”按钮时,应用程序崩溃(触发时)。我的目标是能够单击日期按钮,显示日期选择器。这是我的代码。希望这对任何人都有足够的信息来帮助我,谢谢大家。
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>
Date Class:
日期类:
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();
{
}
}
}
}
2 个解决方案
#1
1
You are calling
你在打电话
mPickDate.setOnClickListener(this);
before
之前
mPickDate = (Button) findViewById(R.id.pickDate);
which would cause a NullPointerException, and therefore a crash. Set the listener after you initilize the Button variable
这会导致NullPointerException,从而导致崩溃。在初始化Button变量后设置监听器
#2
0
You are mixing three separate types of onClick
callback.
您正在混合三种不同类型的onClick回调。
- In the XML, you are specifying by name the function that will be called in the
Activity
class. If I were using this method, I would direct clicks to a function other thanonClick()
. - 在XML中,您将按名称指定将在Activity类中调用的函数。如果我使用这种方法,我会将点击指向onClick()以外的函数。
- In the
Date
activity, you are implementingOnClickListener
and then sending button clicks to the containing activity. This would call theonClick()
method at the bottom of the class. Later, you specify theOnClickListener
to be a function defined in-line. I would not do this latter. - 在Date活动中,您正在实现OnClickListener,然后将按钮单击发送到包含的活动。这将调用类底部的onClick()方法。稍后,您将OnClickListener指定为内联定义的函数。我不会这样做。
- In the
ScheduleService
activity, you are implementingOnClickListener
and then sending button clicks to the containing activity. Later, you implementonClick()
. This is typical. - 在ScheduleService活动中,您正在实现OnClickListener,然后将按钮单击发送到包含的活动。稍后,您实现onClick()。这是典型的。
For more information about handling onClick()
, see "Easier click listeners" in this article: http://developer.android.com/resources/articles/ui-1.6.html
有关处理onClick()的更多信息,请参阅本文中的“更轻松的单击侦听器”:http://developer.android.com/resources/articles/ui-1.6.html
#1
1
You are calling
你在打电话
mPickDate.setOnClickListener(this);
before
之前
mPickDate = (Button) findViewById(R.id.pickDate);
which would cause a NullPointerException, and therefore a crash. Set the listener after you initilize the Button variable
这会导致NullPointerException,从而导致崩溃。在初始化Button变量后设置监听器
#2
0
You are mixing three separate types of onClick
callback.
您正在混合三种不同类型的onClick回调。
- In the XML, you are specifying by name the function that will be called in the
Activity
class. If I were using this method, I would direct clicks to a function other thanonClick()
. - 在XML中,您将按名称指定将在Activity类中调用的函数。如果我使用这种方法,我会将点击指向onClick()以外的函数。
- In the
Date
activity, you are implementingOnClickListener
and then sending button clicks to the containing activity. This would call theonClick()
method at the bottom of the class. Later, you specify theOnClickListener
to be a function defined in-line. I would not do this latter. - 在Date活动中,您正在实现OnClickListener,然后将按钮单击发送到包含的活动。这将调用类底部的onClick()方法。稍后,您将OnClickListener指定为内联定义的函数。我不会这样做。
- In the
ScheduleService
activity, you are implementingOnClickListener
and then sending button clicks to the containing activity. Later, you implementonClick()
. This is typical. - 在ScheduleService活动中,您正在实现OnClickListener,然后将按钮单击发送到包含的活动。稍后,您实现onClick()。这是典型的。
For more information about handling onClick()
, see "Easier click listeners" in this article: http://developer.android.com/resources/articles/ui-1.6.html
有关处理onClick()的更多信息,请参阅本文中的“更轻松的单击侦听器”:http://developer.android.com/resources/articles/ui-1.6.html