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 ofgetViewLifecycleOwner()
尝试以下操作:
使用
this
intead ofgetViewLifecycleOwner()
是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”)。我的问题现在解决了。