0

我还有一个问题。我在布局中定义了 CheckBoxes,并在类中使用 isChecked() 方法获取它们的状态。但是,每当使用以下错误日志调用此方法时,我都会收到错误消息:

09-05 14:55:58.457: ERROR/AndroidRuntime(582): FATAL EXCEPTION: main
09-05 14:55:58.457: ERROR/AndroidRuntime(582): java.lang.IllegalStateException: Could not execute method of the activity
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at android.view.View$1.onClick(View.java:2144)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at android.view.View.performClick(View.java:2485)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at android.view.View$PerformClick.run(View.java:9080)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at android.os.Handler.handleCallback(Handler.java:587)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at android.os.Looper.loop(Looper.java:123)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at android.app.ActivityThread.main(ActivityThread.java:3683)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at java.lang.reflect.Method.invokeNative(Native Method)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at java.lang.reflect.Method.invoke(Method.java:507)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at dalvik.system.NativeStart.main(Native Method)
09-05 14:55:58.457: ERROR/AndroidRuntime(582): Caused by: java.lang.reflect.InvocationTargetException
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at java.lang.reflect.Method.invokeNative(Native Method)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at java.lang.reflect.Method.invoke(Method.java:507)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at android.view.View$1.onClick(View.java:2139)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     ... 11 more
09-05 14:55:58.457: ERROR/AndroidRuntime(582): Caused by: java.lang.NullPointerException
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     at alesito.WorkingHoursLogger.zapolniDelavnike.shraniUrnik(zapolniDelavnike.java:88)
09-05 14:55:58.457: ERROR/AndroidRuntime(582):     ... 14 more

这是类代码:

private DatabaseAdapter dbOperator;
private Cursor cursor;
private static final String TABLE_NAME = "hours";
public static final String COL_ROWID = "_id";
public static final String COL_DATE = "date";
public static final String COL_DATE_TYPE = "dateType";
public static final String COL_DEF_HOURS = "defaultHours";
public static final String COL_COR_HOURS = "correctionHours";
public static final String COL_OPOMBA = "opomba";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dnevi);
    dbOperator = new DatabaseAdapter(this);
    dbOperator.open();

}
public void zapolniDni(View view){
    setContentView(R.layout.zapolni);
}
public void shraniUrnik(View view) throws ParseException{
    DatePicker zacetniDatumPicker = (DatePicker)findViewById(R.id.zacetniDatum);
    DatePicker koncniDatumPicker = (DatePicker)findViewById(R.id.koncniDatum);


    TimePicker zacetniUraPicker = (TimePicker)findViewById(R.id.zacetnaUra);
    Time zacetnaUra = new Time();
    zacetnaUra.set(0, zacetniUraPicker.getCurrentMinute(), zacetniUraPicker.getCurrentHour(), 0, 0, 0);

    TimePicker koncniUraPicker = (TimePicker)findViewById(R.id.koncnaUra);
    Time koncnaUra = new Time();
    koncnaUra.set(0, koncniUraPicker.getCurrentMinute(), koncniUraPicker.getCurrentHour(), 0, 0, 0);

    double razlika = 0;
    if (Time.compare(zacetnaUra, koncnaUra) < 0){
        double zacetniCas = zacetnaUra.hour * 60 + zacetnaUra.minute;
        double koncniCas = koncnaUra.hour * 60 + koncnaUra.minute;
        razlika = (koncniCas - zacetniCas) / 60;
    }

    CheckBox ponedeljek = (CheckBox)findViewById(R.id.ponedeljek);
    CheckBox torek = (CheckBox)findViewById(R.id.torek);
    CheckBox sreda = (CheckBox)findViewById(R.id.sreda);
    CheckBox cetrtek = (CheckBox)findViewById(R.id.cetrtek);
    CheckBox petek = (CheckBox)findViewById(R.id.petek);
    CheckBox sobota = (CheckBox)findViewById(R.id.sobota);
    CheckBox nedelja = (CheckBox)findViewById(R.id.nedelja);


    GregorianCalendar gcal = new GregorianCalendar();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.M.d");
    Date startDate = sdf.parse(zacetniDatumPicker.getYear()+"."+ (zacetniDatumPicker.getMonth()+1)+"."+ zacetniDatumPicker.getDayOfMonth());
    Date endDate = sdf.parse(koncniDatumPicker.getYear()+"."+ (koncniDatumPicker.getMonth()+1)+"."+ (koncniDatumPicker.getDayOfMonth()+1));


    gcal.setTime(startDate);
    while (gcal.getTime().before(endDate)){
        switch (gcal.getTime().getDay()){
            case 0:
                if (nedelja.isChecked()){
                    dbOperator.createDay(Integer.toString(gcal.getTime().getYear())+Integer.toString((gcal.getTime().getMonth()+1))+Integer.toString(gcal.getTime().getDate()), gcal.getTime().toString(), razlika, 0.0, "");
                }
            case 1:
                if (ponedeljek.isChecked()){
                    dbOperator.createDay(Integer.toString(gcal.getTime().getYear())+Integer.toString((gcal.getTime().getMonth()+1))+Integer.toString(gcal.getTime().getDate()), gcal.getTime().toString(), razlika, 0.0, "");
                }
            case 2:
                if (torek.isChecked()){
                    dbOperator.createDay(Integer.toString(gcal.getTime().getYear())+Integer.toString((gcal.getTime().getMonth()+1))+Integer.toString(gcal.getTime().getDate()), gcal.getTime().toString(), razlika, 0.0, "");
                }
            case 3:
                if (sreda.isChecked()){
                    dbOperator.createDay(Integer.toString(gcal.getTime().getYear())+Integer.toString((gcal.getTime().getMonth()+1))+Integer.toString(gcal.getTime().getDate()), gcal.getTime().toString(), razlika, 0.0, "");
                }
            case 4:
                if (cetrtek.isChecked()){
                    dbOperator.createDay(Integer.toString(gcal.getTime().getYear())+Integer.toString((gcal.getTime().getMonth()+1))+Integer.toString(gcal.getTime().getDate()), gcal.getTime().toString(), razlika, 0.0, "");
                }
            case 5:
                if (petek.isChecked()){
                    dbOperator.createDay(Integer.toString(gcal.getTime().getYear())+Integer.toString((gcal.getTime().getMonth()+1))+Integer.toString(gcal.getTime().getDate()), gcal.getTime().toString(), razlika, 0.0, "");
                }
            case 6:
                if (sobota.isChecked()){
                    dbOperator.createDay(Integer.toString(gcal.getTime().getYear())+Integer.toString((gcal.getTime().getMonth()+1))+Integer.toString(gcal.getTime().getDate()), gcal.getTime().toString(), razlika, 0.0, "");
                }
            default:
                Toast nicOznaceno = Toast.makeText(this, "nič ni označeno", Toast.LENGTH_LONG);
                nicOznaceno.show();
        }
        gcal.add(gcal.DAY_OF_YEAR, 1);
    }
}

这是布局文件:

xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scrollbars="">
    <TextView 
        android:id="@+id/navodiloDnevi"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:text="@string/navodiloDnevi"/>
    <CheckBox 
        android:id="@+id/ponedeljek"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/navodiloDnevi"
        android:text="@string/ponedeljek"/>
    <CheckBox 
        android:id="@+id/torek"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/ponedeljek"
        android:text="@string/torek"/>
    <CheckBox 
        android:id="@+id/sreda"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/torek"
        android:text="@string/sreda"/>
    <CheckBox 
        android:id="@+id/cetrtek"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/sreda"
        android:text="@string/cetrtek"/>
    <CheckBox 
        android:id="@+id/petek"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/cetrtek"
        android:text="@string/petek"/>
    <CheckBox 
        android:id="@+id/sobota"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/petek"
        android:text="@string/sobota"/>
    <CheckBox 
        android:id="@+id/nedelja"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_below="@id/sobota"
        android:text="@string/nedelja"/>
    <Button
        android:id="@+id/posljiIzbraneDni"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/posljiIzbraneDni"
        android:onClick="zapolniDni"
        android:layout_below="@id/nedelja"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

为什么我会收到错误消息?

编辑:

好的,我会进一步说明。上面有源的类调用了两个布局。调用的第一个布局 (R.layout.dnevi) 包含复选框(附加的 xml 源)。完成检查并单击按钮后,将执行类中的下一个方法,该方法显示新布局 (R.layout.zapolni)。这个不包含任何复选框,但它使用第一个布局(R.layout.dnevi)中的数据(选中/未选中)。希望这可以帮助。

4

2 回答 2

1

不是CheckBox#isChecked()抛出 的方法NullPointerException,而是你的shraniUrnik(View)方法。因此,我会得出结论,该方法没有正确找到您的复选框findViewById()。这可能是由于选择了错误的布局造成的。我可以看到您正在setContentView()onCreate和呼叫zapolniDni。如果这些布局之一不包含复选框,shraniUrnik(View)并且在应用后调用这些复选框,NullPointerException则将被抛出。

于 2011-09-05T13:20:35.137 回答
0

好吧,我找到了一个解决方案,因为我在网上找到的任何东西都没有帮助。我为两种布局创建了单独的活动,并使用 putExtra() 将 isChecked 状态放入 Intent。

于 2011-09-06T10:47:37.487 回答