Java 无法从onClick Android调用其他方法-抛出非法状态异常
我是Android的新手,正在创建一个简单的联系人应用程序。我有一个“联系人”类,它包含名字、姓氏等,在我的活动中,我试图从编辑文本框中读取输入并创建一个新联系人 问题是,当我在辅助活动页面中调用createContact()时,在执行该方法之前会立即抛出一个illegalStateException。在过去的一天里,我一直在寻找解决办法,不知道这是错的。这两个函数都是项目中第二个活动页的一部分,都在同一个Java类中……这就像我可以在onclick方法中访问我想要的任何东西一样,但是一旦我尝试在该方法之外调用函数或类,我就会得到一个异常 谢谢你的帮助 以下是我的onclick的代码:Java 无法从onClick Android调用其他方法-抛出非法状态异常,java,android,Java,Android,我是Android的新手,正在创建一个简单的联系人应用程序。我有一个“联系人”类,它包含名字、姓氏等,在我的活动中,我试图从编辑文本框中读取输入并创建一个新联系人 问题是,当我在辅助活动页面中调用createContact()时,在执行该方法之前会立即抛出一个illegalStateException。在过去的一天里,我一直在寻找解决办法,不知道这是错的。这两个函数都是项目中第二个活动页的一部分,都在同一个Java类中……这就像我可以在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方法:
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;
}
堆栈跟踪:
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)
完整的活动代码:
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是您提供给convertDate方法的日期。这在堆栈跟踪中有明确说明。最好修改convertDate方法,如下所示,以便在try-catch块中也包含sdf.format方法。并将catch close更改为接受所有异常,而不是特定的解析异常
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;
}
Issue in是提供给convertDate方法的日期。这在堆栈跟踪中有明确说明。最好修改convertDate方法,如下所示,以便在try-catch块中也包含sdf.format方法。并将catch close更改为接受所有异常,而不是特定的解析异常
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;
}
把你的书堆贴上去看看书堆是怎么回事?我怀疑还有一个原因是lineFWIW,我很久以前就停止在xml中添加单击操作了。只在Java类中设置侦听器的代码并不多。同样更容易调试布局文件,可能是onclick声明的问题,post-your-stack-traced-stack-traceIs这是全部吗?我怀疑还有一个原因是lineFWIW,我很久以前就停止在xml中添加单击操作了。只在Java类中设置侦听器的代码并不多。同样更容易调试布局文件,onclick声明可能会出现问题