2012-04-10 15 views
0

我的問題是參考OnclickListner和java類。我有一個帶有兩個按鈕的xml佈局;一個(點擊時)觸發「日期」類,另一個觸發「電子郵件」類。電子郵件按鈕工作正常,但是當我嘗試設置一個點擊監聽器的「日期」按鈕時,應用程序崩潰(當觸發)。我的目標是能夠點擊日期按鈕,顯示日期選擇器。這是我的代碼。 希望這是足夠的信息,任何人都可以幫助我,謝謝大家。如何使用兩個不同類的onClickListeners引用佈局

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類:

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[] = { "[email protected]" }; 
    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[] { "[email protected]" }); 
    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(); 
    { 

    } 

} 

}

+0

你會想在這裏包括堆棧跟蹤。 – 2012-04-10 20:48:24

回答

1

要調用

mPickDate.setOnClickListener(this); 

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

這將導致NullPointerException,並因此崩潰。在初始化Button變量後設置監聽器

+0

我將編輯代碼。我仍然有問題,所以我一起鞏固了課程。目前,文本視圖(應該顯示日期的位置)顯示爲false;但是,如果您單擊按鈕,它似乎刷新頁面,然後顯示日期。 – MADPADGE 2012-04-23 16:42:03

0

您正在混合三種不同類型的onClick回調。

  • 在XML中,您將通過名稱指定將在Activity類中調用的函數。如果我使用這種方法,我會直接點擊除onClick()之外的其他功能。
  • Date活動中,您正在實施OnClickListener,然後將按鈕點擊發送到包含活動。這將在課程底部調用onClick()方法。稍後,您將OnClickListener指定爲內嵌定義的函數。我不會做後者。
  • ScheduleService活動中,您正在實施OnClickListener,然後將按鈕點擊發送到包含活動。稍後,您將執行onClick()。這是典型的。

有關處理onClick()的更多信息,請參見「易點擊監聽器」在這篇文章中:http://developer.android.com/resources/articles/ui-1.6.html

相關問題