Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t访问片段视图';getView()为null时的LifecycleOwner_Java_Android_Android Alertdialog_Android Livedata_Android Viewmodel - Fatal编程技术网

Java Can';t访问片段视图';getView()为null时的LifecycleOwner

Java Can';t访问片段视图';getView()为null时的LifecycleOwner,java,android,android-alertdialog,android-livedata,android-viewmodel,Java,Android,Android Alertdialog,Android Livedata,Android Viewmodel,我试图在我的AlertDialog中查看我房间数据库中所有练习名称的列表 但是,我收到以下错误消息: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.app.Application android.app.Activity.getApplication()” 此处出现错误消息: childExerciseViewModel = ViewModelProviders.of((FragmentActivity) context).get(

我试图在我的
AlertDialog
中查看我房间数据库中所有练习名称的列表

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

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.app.Application android.app.Activity.getApplication()”

此处出现错误消息:

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);
                    }
                }
            }
        });
    }
}

public类AddExerciseDialog扩展了appcompatidialogfragment{
私有EditText editTextExerciseName;
private ChildExerciseViewModel ChildExerciseViewModel;
字符串userEnteredExerciseName;
int exerciseTypeID;
按钮取消;
按钮addBtn;
语境;
@可空
@凌驾
创建视图时的公共视图(@NonNull LayoutInflater inflater、@Nullable ViewGroup container、@Nullable Bundle savedInstanceState){
childExerciseViewModel=ViewModelProviders.of((FragmentActivity)context.get(childExerciseViewModel.class);
//返回视图;
返回充气机。充气(R.layout.layout\u对话框\u添加\u练习,容器,错误);
}
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
editTextExerciseName=getView().findViewById(R.id.editTextExerciseName);
addBtn=(按钮)getView().findViewById(R.id.addBtn);
cancelBtn=(按钮)getView().findViewById(R.id.cancelBtn);
addBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Bundle mArgs=getArguments();
exerciseTypeID=mArgs.getInt(“exerciseTypeID”);
userEnteredExerciseName=editTextExerciseName.getText().toString();
ChildExecuteViewModel.GetAllChildExecuteNames().observe((FragmentActivity)上下文,this::CheckIfChildExecuteNamealReadyExists);
//这将检查子练习是否已经存在,如果已经存在,则添加错误toast
}
private void checkIfChildExerciseNameAlreadyExists(列出ChildExerciseList){
对于(int i=0;i
试试这个:

使用
this
intead of
getViewLifecycleOwner()

尝试以下操作:


使用
this
intead of
getViewLifecycleOwner()

是AddExerciseDialog扩展dialogfragment吗?是
AddExerciseDialog扩展AppCompatDialogFragment
然后在oncreateview中编写相同的代码,它们的视图将始终可用,并将解决您的响应问题,
onCreateView
onCreateDialog
不同。我想创建一个对话框弹出窗口。请您澄清一下您的建议。是的,onCreateView和onCreateDialog不一样,但这取决于您希望如何使用对话框,对于您的用例,我建议您将其用作视图,因为您需要您的viewmodel,而viewmodel取决于视图生命周期,这就是为什么onCreateDialog中始终为空。此外,如果移动到onCreateView,一切都将几乎相同。AddExerciseDialog是否扩展dialogfragment?是
AddExerciseDialog扩展AppCompatiDialogFragment
,然后在onCreateView中编写相同的代码,它们的视图将始终可用,并将解决响应的问题,
onCreateView
onCreateDialog
不同。我想创建一个对话框弹出窗口。请您澄清一下您的建议。是的,onCreateView和onCreateDialog不一样,但这取决于您希望如何使用对话框,对于您的用例,我建议您将其用作视图,因为您需要您的viewmodel,而viewmodel取决于视图生命周期,这就是为什么onCreateDialog中始终为空。此外,如果您移动到onCreateView,一切都将几乎相同。不幸的是,这不起作用:无法解析方法
getActivity()
Required:Lifecycle Owner,前提是:OnClickListener使用类似的方法this@yourFragmentName. 因为我的片段名是SelectDriverFragment。我正在使用this@SelectDriverFragment而不是viewLifecycleOwner。并在我的方法上使用@SuppressLint(“FragmentLiveDataObserve”)。我的问题现在解决了。不幸的是,这不起作用:无法解析方法
getActivity()
Required:Lifecycle Owner,前提是:onClickListener使用类似的方法this@yourFragmentName. 因为我的片段名是SelectDriverFragment。我正在使用this@SelectDriverFragment而不是viewLifecycleOwner。并在我的方法上使用@SuppressLint(“FragmentLiveDataObserve”)。我的问题现在解决了。