I know what a null pointer exception is. I just don't see what is wrong here. The checkbox is initialized to a checkbox type variable and assigned a view object. What am I missing? Any help is appreciated.
2020-08-24 12:32:05.868 22356-22356/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.kittybreath.android.criminalintent2, PID: 22356 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.CheckBox.setOnCheckedChangeListener(android.widget.CompoundButton$OnCheckedChangeListener)' on a null object reference at com.kittybreath.android.criminalintent2.CrimeFragment.onCreateView(CrimeFragment.java:62)
package com.kittybreath.android.criminalintent2;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public class CrimeFragment extends Fragment {
private Crime crime;
private EditText titleField;
private Button dateButton;
private CheckBox solvedCheckBox;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
crime = new Crime();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_crime, container, false);
titleField = v.findViewById(R.id.crime_title);
dateButton = v.findViewById(R.id.crime_date);
solvedCheckBox = v.findViewById(R.id.crime_solved);
titleField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
crime.setTitle(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
dateButton.setText(crime.getDate().toString());
dateButton.setEnabled(false);
solvedCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
crime.setSolved(isChecked);
}
});
return v;
}
}
Crime Class
package com.kittybreath.android.criminalintent2;
import java.util.Date;
import java.util.UUID;
public class Crime {
private UUID id;
private String title;
private Date date;
private boolean solved;
// Constructor assigns unique id and default current date
public Crime() {
id = UUID.randomUUID();
date = new Date();
}
// Getters and Setters
public UUID getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public boolean isSolved() {
return solved;
}
public void setSolved(boolean solved) {
this.solved = solved;
}
}
XML Code
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="16dp">
<TextView
style="?android:listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crime_title_label"/>
<EditText
android:id="@+id/crime_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/crime_title_hint"/>
<TextView
style="?android:listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crime_details_label"/>
<Button
android:id="@+id/crime_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<CheckBox
android:id="@+id/crime_solved"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/crime_solved_label"/>
</LinearLayout>