首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android.app.FragmentManager.beginTransaction()‘:尝试调用虚拟方法的android.app.FragmentTransaction android.app.FragmentTransaction

android.app.FragmentManager.beginTransaction()‘:尝试调用虚拟方法的android.app.FragmentTransaction android.app.FragmentTransaction
EN

Stack Overflow用户
提问于 2016-05-20 09:22:46
回答 1查看 11.2K关注 0票数 0

当我试图取消FragmentDialog时,我的应用程序有时会崩溃。

这是日志:

代码语言:javascript
复制
Process: com.xxx, PID: 9981
java.lang.RuntimeException: Error receiving broadcast Intent { act=xxxx flg=0x10 (has extras) } in xxxxxx
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:893)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5438)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.FragmentTransaction android.app.FragmentManager.beginTransaction()' on a null object reference
    at android.app.DialogFragment.dismissInternal(DialogFragment.java:296)
    at android.app.DialogFragment.dismissAllowingStateLoss(DialogFragment.java:277)
    at xxxxx.updateStatus(BaseAppCompatActivity.java:96)
    at xxxxx.access$000(BaseAppCompatActivity.java:43)
    at xxxxx$1.onReceive(BaseAppCompatActivity.java:79)
    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:883)

xxxxx.updateStatus(BaseAppCompatActivity.java:96)

这一行是试图取消一个DialogFragment:

代码语言:javascript
复制
mDialogFragment.dismissAllowingStateLoss();

DialogFragment在我的活动中。

代码语言:javascript
复制
private SimpleBlockedDialogFragment mDialogFragment = SimpleBlockedDialogFragment.newInstance();

所以mDialogFragment不是空的。

我展示这样的对话:

代码语言:javascript
复制
FragmentTransaction ft = getFragmentManager().beginTransaction();
mDialogFragment.updateMessage("xxx");
mDialogFragment.show(ft, "block_dialog");

并取消这样的对话框:

代码语言:javascript
复制
mDialogFragment.dismissAllowingStateLoss();

有时,我只显示对话一次,但驳回不止一次。但我不认为那会引起车祸。

下面是dismissInternal在DialogFragment中的函数:

代码语言:javascript
复制
void dismissInternal(boolean allowStateLoss) {
    if (mDismissed) {
        return;
    }
    mDismissed = true;
    mShownByMe = false;
    if (mDialog != null) {
        mDialog.dismiss();
        mDialog = null;
    }
    mViewDestroyed = true;
    if (mBackStackId >= 0) {
        getFragmentManager().popBackStack(mBackStackId,
                FragmentManager.POP_BACK_STACK_INCLUSIVE);
        mBackStackId = -1;
    } else {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.remove(this);
        if (allowStateLoss) {
            ft.commitAllowingStateLoss();
        } else {
            ft.commit();
        }
    }
}

日志告诉我,getFragmentManager()返回null。我不知道为什么会这样。

如何正确地驳回FragmentDialog?

更新:

我尝试了android.support.v4.app.FragmentTransaction,但仍然得到了一个例外。

代码语言:javascript
复制
Caused by: 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.dismissInternal(DialogFragment.java:196)
    at android.support.v4.app.DialogFragment.dismissAllowingStateLoss(DialogFragment.java:177)

帮助~

EN

回答 1

Stack Overflow用户

发布于 2016-05-20 09:46:46

试试getSupportFragmentManager().beginTransaction();,这可能会有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37342869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档