简体   繁体   中英

Cant call another method from onClick Android - Throws illegalStateException

I am fairly new to Android, and am creating a simple contacts app. I have a 'Contact' class that holds first name, last name, etc, and in my activity I am attempting to read the input from the edit text boxes and create a new contact.

The problem is that when I call createContact() in my secondary activity page, an illegalStateException is immediately thrown before the method is executed. I have been searching for a fix for the past day, and do not know that is wrong. Both functions are part of a second activity page in the project, both in the same Java class...its like I can access anything I want in the onclick method, but as soon as I attempt a function or a class call outside of that method, I get an exception.

Thanks for any help.

Here is the code for my onclick:

public void onSaveClicked(View v) {

        // Create a new contact from form data
        Contact contact = createContact();


        try {
        FileOutputStream fileout=openFileOutput("contactList.txt", MODE_PRIVATE);
        OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
        outputWriter.write(contact.getFirstName());
        outputWriter.close();

        //display file saved message
        Toast.makeText(getBaseContext(), contact.getFirstName() + contact.getLastName() + " saved successfully!",
                Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

createContact method:

    private Contact createContact()  {
    Contact contact = new Contact(
            firstNameEditText.getText().toString(),
            middleInitialEditText.getText().toString().charAt(0), //Convert string to char
            lastNameEditText.getText().toString(),
            phoneNumberEditText.getText().toString(),
            convertDate(birthdateButton.getText()),     // Convert CharSequence to Date Obj
            convertDate(firstMetButton.getText())       // Convert CharSequence to Date Obj
    );
    return contact;
}

Stack Trace:

02-21 02:36:58.399 11526-11526/com.fafaffy.contacts E/AndroidRuntime: FATAL EXCEPTION: main
                                                                  Process: com.fafaffy.contacts, PID: 11526
                                                                  java.lang.IllegalStateException: Could not execute method for android:onClick
                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
                                                                      at android.view.View.performClick(View.java:5637)
                                                                      at android.view.View$PerformClick.run(View.java:22429)
                                                                      at android.os.Handler.handleCallback(Handler.java:751)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                      at android.os.Looper.loop(Looper.java:154)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                   Caused by: java.lang.reflect.InvocationTargetException
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
                                                                      at android.view.View.performClick(View.java:5637) 
                                                                      at android.view.View$PerformClick.run(View.java:22429) 
                                                                      at android.os.Handler.handleCallback(Handler.java:751) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                      at android.os.Looper.loop(Looper.java:154) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                                                                   Caused by: java.lang.IllegalArgumentException: Cannot format given Object as a Date
                                                                      at java.text.DateFormat.format(DateFormat.java:302)
                                                                      at java.text.Format.format(Format.java:157)
                                                                      at com.fafaffy.contacts.DetailContact.convertDate(DetailContact.java:117)
                                                                      at com.fafaffy.contacts.DetailContact.createContact(DetailContact.java:107)
                                                                      at com.fafaffy.contacts.DetailContact.onSaveClicked(DetailContact.java:72)
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                                                                      at android.view.View.performClick(View.java:5637) 
                                                                      at android.view.View$PerformClick.run(View.java:22429) 
                                                                      at android.os.Handler.handleCallback(Handler.java:751) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                      at android.os.Looper.loop(Looper.java:154) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:6119) 
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

Complete Activity Code:

public class DetailContact extends AppCompatActivity {

// Create vars for all form fields
private EditText firstNameEditText;
private EditText lastNameEditText;
private EditText middleInitialEditText;
private EditText phoneNumberEditText;
private Button birthdateButton;
private Button firstMetButton;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_detail_contact);


    // Assign vars to form fields
    firstNameEditText       = (EditText)findViewById(R.id.firstNameTextBox);
    lastNameEditText        = (EditText)findViewById(R.id.lastNameTextBox);
    middleInitialEditText   = (EditText)findViewById(R.id.middleInitialTextBox);
    phoneNumberEditText     = (EditText)findViewById(R.id.phoneNumberTextBox);
    birthdateButton         = (Button)findViewById(R.id.birthdate);
    firstMetButton          = (Button)findViewById(R.id.firstContactDateButton);


}
public void showDatePickerDialog(View v) {
    DatePickerFragment newFragment = new DatePickerFragment();
    newFragment.setButton((Button)v);
    newFragment.show(getFragmentManager(), "date picker");
    //((Button)v).setText(newFragment.getSelectedDate().toString());
}






// Working Save Function  --------------------------------------------------------------------------------------------------------
    public void onSaveClicked(View v) {

        // Create a new contact from form data
        Contact contact = createContact();

        try {
        FileOutputStream fileout=openFileOutput("contactList.txt", MODE_PRIVATE);
        OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
        outputWriter.write(contact.getFirstName());
        outputWriter.close();

        //display file saved message
        Toast.makeText(getBaseContext(), contact.getFirstName() + contact.getLastName() + " saved successfully!",
                Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

// Method creates a contact from form input
// Middle initial is converted from string to char
// Birthdate & firstMet date are both converted from CharSequence to Date objects
public  Contact createContact()  {
    Contact contact = new Contact(
            firstNameEditText.getText().toString(),
            middleInitialEditText.getText().toString().charAt(0), //Convert string to char
            lastNameEditText.getText().toString(),
            phoneNumberEditText.getText().toString(),
            convertDate(birthdateButton.getText()),     // Convert CharSequence to Date Obj
            convertDate(firstMetButton.getText())       // Convert CharSequence to Date Obj
    );

    return contact;
}


// Helper method from createContact method -- birtdate & firstmet date need to be converted
// from CharSequence to Date objects to match Contact model
private Date convertDate(CharSequence input) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String dateString = sdf.format(input);
    Date date = null;
    try {
        date = sdf.parse(dateString);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;
}

}

Issue in is the date you are providing to the convertDate method. This is clearly stated in the stack trace. Better you modify your convertDate method like as below to include sdf.format method also in try catch block. And changed catch close to accept all exception instead of specific parse exception.

private Date convertDate(CharSequence input) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

     date = null;
    try {
         String dateString = sdf.format(input);
        date = sdf.parse(dateString);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return date;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM