Search code examples
javaandroidnullpointerexceptionandroid-room

Attempt to invoke interface method on a null object reference and I don't know how to solve it


I'm new to Android Studio and I'm learning on how to use Fragament Dialog from inside a Fragment. I'd like to ask why it says "null objext reference".

Here is the code for the fragment :

public class PelangganFragment extends Fragment implements CreatePelangganDialog.CreatePelangganListener,
        PelangganLVAdapter.OnPelangganClickListner,
        UpdatePelangganDialog.UpdatePelangganListener {

    private RecyclerView mRecyclerView;
    private View parent;
    private Context context;

    private PelangganViewModel mViewModel;
    private FragmentPelangganBinding fragmentPelangganBinding;
    private PelangganLVAdapter mAdapter;

    public static PelangganFragment newInstance() {
        return new PelangganFragment();
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        //return inflater.inflate(R.layout.fragment_pelanggan, container, false);
        mViewModel = new ViewModelProvider(this).get(PelangganViewModel.class);


        fragmentPelangganBinding = FragmentPelangganBinding.inflate(inflater,container,false);
        View root = fragmentPelangganBinding.getRoot();

        parent = root.findViewById(android.R.id.content);
        FloatingActionButton fab = root.findViewById(R.id.fab);
        mRecyclerView = root.findViewById(R.id.recyclerView);

        //context = this;
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this.getContext());
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mRecyclerView.setHasFixedSize(true);

        //Set adapter to RecyclerView
        mAdapter = new PelangganLVAdapter();
        mAdapter.setItemOnClick(this);
        mRecyclerView.setAdapter(mAdapter);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                openCreatePelangganDialog();
            }
        });


        return root;
    }

    private void openCreatePelangganDialog() {
        CreatePelangganDialog createPelangganDialog = new CreatePelangganDialog();
        createPelangganDialog.show(
                getChildFragmentManager(), CreatePelangganDialog.TAG);
    }


    @Override
    public void saveNewPelanggan(ListViewModelPelanggan pelanggan) {
        mViewModel.insert(pelanggan);
        snackBar("Pelanggan Saved");
    }
}

here is the code for the FragmentDialog, the error occurs on this class and I commented on which line the error occurs :

public class CreatePelangganDialog extends DialogFragment {

    private EditText mNama;
    private EditText mNik;
    private EditText mALamat;
    private EditText mPekerjaan;
    private EditText mKeperluan;
    private Button mSaveBtn;
    private CreatePelangganListener mListener;

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.pelanggan_dialog,null);

        builder.setView(view);
        builder.setCancelable(true);
        builder.setTitle("Tambah Pelanggan");

        mNama = view.findViewById(R.id.et_nama);
        mNik = view.findViewById(R.id.et_nik);
        mALamat = view.findViewById(R.id.et_alamat);
        mPekerjaan = view.findViewById(R.id.et_Pekerjaan);
        mKeperluan = view.findViewById(R.id.et_keperluan);
        mSaveBtn = view.findViewById(R.id.btn_save);

        mSaveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String nama = mNama.getText().toString();
                String nik = mNik.getText().toString();
                String alamat = mALamat.getText().toString();
                String pekerjaan = mPekerjaan.getText().toString();
                String keperluan = mKeperluan.getText().toString();

                if(nama.isEmpty()||nik.isEmpty()||alamat.isEmpty()||pekerjaan.isEmpty()||keperluan.isEmpty()) {
                    return;
                }
                else {
                    ListViewModelPelanggan pelanggan = new ListViewModelPelanggan(nama,nik,alamat,
                            pekerjaan,keperluan);
                    mListener.saveNewPelanggan(pelanggan); //the error occurs here
                    dismiss();
                }
            }
        });

        return builder.create();
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        mListener = (CreatePelangganListener) getTargetFragment();
    }

    public interface CreatePelangganListener{
        void saveNewPelanggan(ListViewModelPelanggan pelanggan);
    }

    public static String TAG = "Tambah Pelanggan Dialog";
}


Solution

  • I solved my problem by replacing getTargetFragment() with getParentFragment() in these lines

    @Override
        public void onAttach(@NonNull Context context) {
            super.onAttach(context);
            mListener = (CreatePelangganListener) getParentFragment();
        }