尝试将新的dialogFragment添加到片段上的现有对话框片段时,在null对象引用上使用FragmentManager.beginTransaction()。

时间:2018-12-06 12:39:36

标签: java android dialogfragment fragmentmanager

这不是重复的问题,因为问题的发生是不同的..因为我只是在尝试准确执行我提到的内容时才遇到这种行为(布局顺序明智)

我正在尝试通过另一个对话框片段创建一个新的对话框片段。当我尝试这样做时,它会抛出error

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference
        at android.support.v4.app.DialogFragment.show(DialogFragment.java:142)

这是相关代码

ForgotPasswordFailedFragment forgotPasswordFailedFragment = new ForgotPasswordFailedFragment();
        forgotPasswordFailedFragment.show(getFragmentManager(), "Password Reset Failed");

所以我的查看顺序是这样的。

  

mainActivity->片段-> dialogfragment-> dialogfragment(我正在尝试获取它)

我已经尝试过提到答案,并且挑逗是每次更改所发生的错误...

ForgotPswrdSuccessFragment forgotPswrdSuccessFragment = new ForgotPswrdSuccessFragment(); forgotPswrdSuccessFragment.show(requireActivity()。getSupportFragmentManager(),“密码重置失败”);

这会抛出

 Fragment ForgotPasswordDFragment{725811b} not attached to an activity.
            at android.support.v4.app.Fragment.requireActivity(Fragment.java:724)
            at *********.SignIn.ForgotPassword.ForgotPasswordDFragment.showSuccessDialog(ForgotPasswordDFragment.java:85)

ForgotPasswordDFragment是一个位于片段上的对话框片段 我从那儿的(ForgotPasswordDFragment)调用了另一个dialogfragment。现在,该动作正在引发上述错误

为此

forgotPswrdSuccessFragment.show(this.getChildFragmentManager(), "Password Reset Failed");

例外是

java.lang.IllegalStateException:片段尚未附加。         在android.support.v4.app.Fragment.instantiateChildFragmentManager(Fragment.java:2383)

3 个答案:

答案 0 :(得分:2)

@Sha,您好:

YourDialog yourDialog = YourDialog.newInstance(); 
yourDialog.show(getSupportFragmentManager(),"DialogFragment"); 

答案 1 :(得分:0)

FragmentManager在连接到活动之前将一直为空。

因此请使用下面的代码

如果它是嵌套的片段,请对片段类使用this.getChildFragmentManager()

否则使用getActivity().getFragmentManager()getActivity().getSupportFragmentManager()

答案 2 :(得分:0)

如果片段未附加到上下文,则

getFragmentManager()可能返回null。如已经提到的堆栈跟踪那样,通过传递空引用可能导致未捕获的异常。最直接的方法是将getFragmentManager()包装为非空条件

FragmentManager manager = getFragmentManager();

if (manager != null) {
    //your code
}

但是,为了避免在代码中出现盲空乘客,请考虑使用getSupportFragmentManager()。该方法不能直接在片段上调用。因此,您必须分别致电getActivity().getSupportFragmentManager()requireActivity().getSupportFragmentManager()