当getView为null时,无法访问Fragment View的LifecycleOwner

问题描述

我正在尝试从AlertDialog内的ROOM数据库中观察所有练习名称的列表。

但是我收到以下错误消息:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.Application android.app.Activity.getApplication()' on a null object reference

此处出现错误消息:

childExerciseviewmodel = viewmodelProviders.of((FragmentActivity) context).get(ChildExerciseviewmodel.class);
                       

如何避免该错误

AddExerciseDialog

public class AddExerciseDialog extends AppCompatDialogFragment {

    private EditText editTextExerciseName;
    private ChildExerciseviewmodel childExerciseviewmodel;
    String userEnteredExerciseName;
    int exerciseTypeID;
    Button cancelBtn;
    Button addBtn;
    Context context;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {

        childExerciseviewmodel = viewmodelProviders.of((FragmentActivity) context).get(ChildExerciseviewmodel.class);
        //return view;
        return inflater.inflate(R.layout.layout_dialog_add_exercise,container,false);
    }

    @Override
    public void onViewCreated(@NonNull View view,@Nullable Bundle savedInstanceState) {
        super.onViewCreated(view,savedInstanceState);

        editTextExerciseName = getView().findViewById(R.id.editTextExerciseName);
        addBtn = (Button) getView().findViewById(R.id.addBtn);
        cancelBtn = (Button) getView().findViewById(R.id.cancelBtn);
        addBtn.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Bundle mArgs = getArguments();
                exerciseTypeID = mArgs.getInt("ExerciseTypeID");
                userEnteredExerciseName = editTextExerciseName.getText().toString();
                childExerciseviewmodel.getAllChildExerciseNames().observe((FragmentActivity) context,this::checkIfChildExerciseNameAlreadyExists);
                // this checks if child exercise already exists,if so add error toast
            }

            private void checkIfChildExerciseNameAlreadyExists(List<String> childExercisesList) {
                for (int i = 0; i < childExercisesList.size(); i++) {

                    if (childExercisesList.contains(userEnteredExerciseName)) {
                        Toast.makeText(getContext(),"An exercise with that name already exists",Toast.LENGTH_SHORT).show();
                    } else {
                        final ChildExercises childExercise = new ChildExercises(0,userEnteredExerciseName,null,exerciseTypeID);
                        childExerciseviewmodel.insert(childExercise);
                    }
                }
            }
        });
    }
}

解决方法

尝试一下:

使用this的{​​{1}}接口