java - 无法从 onClick Android 调用另一个方法 - 抛出非法状态异常

标签 java android

我对 Android 相当陌生,正在创建一个简单的联系人应用程序。我有一个“联系人”类,其中包含名字、姓氏等,在我的 Activity 中,我尝试从编辑文本框中读取输入并创建一个新联系人。

问题是,当我在辅助 Activity 页面中调用 createContact() 时,在执行该方法之前会立即抛出非法状态异常。我过去一天一直在寻找修复方法,但不知道这是错误的。这两个函数都是项目中第二个 Activity 页面的一部分,都在同一个 Java 类中...就像我可以在 onclick 方法中访问我想要的任何内容,但是一旦我尝试在该方法之外进行函数或类调用方法,我得到一个异常。

感谢您的帮助。

这是我的 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();
    }
}

创建联系人方法:

    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) 

完整的 Activity 代码:

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 是您提供给convertDate 方法的日期。这在堆栈跟踪中清楚地说明了。最好修改您的convertDate方法,如下所示,将sdf.format方法也包含在try catch block 中。并将 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;
}

关于java - 无法从 onClick Android 调用另一个方法 - 抛出非法状态异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48897249/

相关文章:

java - 将通话与房间同步

java - Java BMI计算器问题-英制或公制用户输入,错误处理,正确值输入,转换

java - 下一行间距问题

java - Android Eclipse 设置 logcat 接收来自模拟器的输入

java - log4j 错误邮件挂起线程

java - 使用 Java 代码删除 Android Q 中的非拥有文件

java - 如何使用内置的 AlertDialog_listItemLayout

android - 有没有办法获得在android中调试的特定权限?

android - Android 中的 OTP 过期实现

android - 网络调用在 android 中抛出 IO 异常和连接被拒绝在 android 设备中不工作