Android 从DialogFragment访问主机活动';s的观点

Android 从DialogFragment访问主机活动';s的观点,android,android-dialogfragment,Android,Android Dialogfragment,我遇到过这样的问题。在我的应用程序中,我有一个活动(MobileActivity),其中包含一些视图(微调器、文本视图和按钮)。当用户单击按钮时,我需要打开一个对话框(ConfirmDialog)。在这个对话框中,我需要显示MobileActivity视图中的一些数据(参见下面的代码)。有时在游戏控制台中,我会看到带有NullPointerException的崩溃报告(我在代码中标记了该行)。 问题在哪里 谢谢大家! 我想,问题可能出在活动的生命周期方法中。我尝试了下一步行动: 在emulat

我遇到过这样的问题。在我的应用程序中,我有一个活动(MobileActivity),其中包含一些视图(微调器、文本视图和按钮)。当用户单击按钮时,我需要打开一个对话框(ConfirmDialog)。在这个对话框中,我需要显示MobileActivity视图中的一些数据(参见下面的代码)。有时在游戏控制台中,我会看到带有NullPointerException的崩溃报告(我在代码中标记了该行)。 问题在哪里

谢谢大家!

我想,问题可能出在活动的生命周期方法中。我尝试了下一步行动:

  • 在emulator上启动我的应用程序并打开DialogFragment
  • 按下主页按钮
  • 在adb中,终止我的进程(adb终止)
  • 从后台应用重新打开我的应用
它没有坠毁。那么,问题不在后面吗

来自MobileActivity的代码,它将打开我的DialogFragment

来自ConfirmDialog的代码

还有来自游戏控制台的stacktrace

我添加了onAttach和onDetach方法来存储对主机活动的引用(下面的代码),并在ConfirmDialog类的所有位置将getActivity()替换为mActivity。它能解决这个问题吗

mActivity Activity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mActivity = activity;
}

@Override
public void onDetach() {
    super.onDetach();
    mActivity = null;
}

保留活动实例并在片段分离时销毁它是避免
NullPointerException

mActivity Activity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mActivity = activity;
}

@Override
public void onDetach() {
    super.onDetach();
    mActivity = null;
}
但是有两件事你可能需要回顾一下

  • 为什么不对片段使用相同的方法,其中是
    onCreateDialog
    中的
    mActivity
    。顺便说一句,在进行任何交易之前,请检查
    mActivity
    的空值
  • 使用
    yourDialogFragment.show()
    显式运行此函数:
  • ft.commit()
    计划此事务的提交。提交不会立即发生。它将被安排为下一次线程准备就绪时在主线程上完成的工作。因此,我们无法确保任何事情,例如,它可能会导致
    IllegalStateException

    怎么样:
    commitAllowingStateLoss()
    。但是在使用之前请仔细阅读文档。看一看

  • 为什么不在创建视图时对视图进行充气?(您不必在
    onCreateDialog
    中执行此操作)

  • 谢谢您的回答!当然,我将使用mActivity而不是getActivity(),但我是否可以确定它将帮助我避免在我的情况下出现NullPointerException?关于非法国家例外:我在其他地方遇到了这个问题。看起来也很奇怪:错误只出现在一部手机上(上个月)。我也无法重现这个问题。为什么我要在onCreateView中膨胀视图,而不是在onCreateDialog中?我从developer.android.com获取了这段代码,因此我确信它是正确的)对于您附加的日志,为每个getActivity()检查null可能会帮助您避免NullPointerException是的,这两种方法都可以,但onCreateView默认为您提供了充气器。您不必从
    活动
    getLayoutInflater
    。实际上,您可以覆盖这两个视图,但在创建对话框视图后尝试膨胀视图时会出现问题。
    java.lang.RuntimeException: 
     at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2814)
     at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2892)
     at android.app.ActivityThread.handleRelaunchActivity (ActivityThread.java:4763)
     at android.app.ActivityThread.-wrap18 (Unknown Source)
     at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1621)
     at android.os.Handler.dispatchMessage (Handler.java:106)
     at android.os.Looper.loop (Looper.java:171)
     at android.app.ActivityThread.main (ActivityThread.java:6635)
     at java.lang.reflect.Method.invoke (Native Method)
     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:547)
     at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:823)
    
    Caused by: java.lang.NullPointerException: 
     at ua.grant.smart.ConfirmDialog.onCreateDialog (ConfirmDialog.java:121)
     at android.app.DialogFragment.onGetLayoutInflater (DialogFragment.java:406)
     at android.app.Fragment.performGetLayoutInflater (Fragment.java:1325)
     at android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1279)
     at android.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1562)
     at android.app.FragmentManagerImpl.moveToState (FragmentManager.java:1623)
     at android.app.FragmentManagerImpl.dispatchMoveToState (FragmentManager.java:3032)
     at android.app.FragmentManagerImpl.dispatchActivityCreated (FragmentManager.java:2984)
     at android.app.FragmentController.dispatchActivityCreated (FragmentController.java:178)
     at android.app.Activity.performCreate (Activity.java:7090)
     at android.app.Activity.performCreate (Activity.java:7075)
     at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1215)
     at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2767)
    
    mActivity Activity;
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        mActivity = null;
    }
    
    mActivity Activity;
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mActivity = activity;
    }
    
    @Override
    public void onDetach() {
        super.onDetach();
        mActivity = null;
    }