Android CheckBox isChecked () выбрасывает нулевой объект - PullRequest
0 голосов
/ 05 сентября 2011

У меня другая проблема. Я определил 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>

Почему я получаю ошибки?

EDIT:

Хорошо, я уточню дальше. Класс, у которого есть источник, вызывает две схемы. Первый макет, который называется (R.layout.dnevi), содержит флажки (прикрепленный источник xml). Когда проверка завершена и кнопка нажата, выполняется следующий метод в классе, который показывает новый макет (R.layout.zapolni). Этот не содержит никаких флажков, но использует данные (отмеченные / не отмеченные) из первого макета (R.layout.dnevi) Надеюсь, это поможет.

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

Это не метод CheckBox#isChecked(), который выбрасывает NullPointerException, это ваш метод shraniUrnik(View). Таким образом, я бы пришел к выводу, что ваши флажки не были правильно найдены методом findViewById(). Это может быть вызвано неправильным выбором макета. Я вижу, вы звоните setContentView() с номерами onCreate и zapolniDni. Если один из этих макетов не содержит флажки с теми, которые shraniUrnik(View) вызывается после его применения, NullPointerException будет выброшено.

0 голосов
/ 06 сентября 2011

Ну, я нашел решение, так как ничего, что я нашел в сети, не помогло. Я создал отдельные действия для обоих макетов и поместил статус isChecked в Intent с помощью putExtra ().

...