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.