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