如何使用不同类中的两个onClickListener引用布局

时间:2022-04-18 05:33:13

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 than onClick().
  • 在XML中,您将按名称指定将在Activity类中调用的函数。如果我使用这种方法,我会将点击指向onClick()以外的函数。
  • In the Date activity, you are implementing OnClickListener and then sending button clicks to the containing activity. This would call the onClick() method at the bottom of the class. Later, you specify the OnClickListener to be a function defined in-line. I would not do this latter.
  • 在Date活动中,您正在实现OnClickListener,然后将按钮单击发送到包含的活动。这将调用类底部的onClick()方法。稍后,您将OnClickListener指定为内联定义的函数。我不会这样做。
  • In the ScheduleService activity, you are implementing OnClickListener and then sending button clicks to the containing activity. Later, you implement onClick(). 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 than onClick().
  • 在XML中,您将按名称指定将在Activity类中调用的函数。如果我使用这种方法,我会将点击指向onClick()以外的函数。
  • In the Date activity, you are implementing OnClickListener and then sending button clicks to the containing activity. This would call the onClick() method at the bottom of the class. Later, you specify the OnClickListener to be a function defined in-line. I would not do this latter.
  • 在Date活动中,您正在实现OnClickListener,然后将按钮单击发送到包含的活动。这将调用类底部的onClick()方法。稍后,您将OnClickListener指定为内联定义的函数。我不会这样做。
  • In the ScheduleService activity, you are implementing OnClickListener and then sending button clicks to the containing activity. Later, you implement onClick(). 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