我是使用Xamarin.Android进行Android开发的新手,我想了解如何解决下一个问题。
有时从后台恢复我的Android应用程序后,我遇到了下一个错误:
Unable to find the default constructor on type MainMenuFragment.
应用程序NavigationDrawerActivity使用MainMenuFragment
来允许用户在应用程序内的不同片段之间切换。
为了解决这个问题,我在MainMenuFragment
添加了一个默认构造函数,如下一个链接所述:
Added a default constructor, should fix the issue.
public class MainMenuFragment : DialogFragment
{
readonly NavigationDrawerActivity navigationDrawer;
#region Constructors
public MainMenuFragment () {} // Default constructor...
public MainMenuFragment (NavigationDrawerActivity navigationDrawer, IMenuType launchMenu = null)
{
if (navigationDrawer == null)
throw new ArgumentNullException ("navigationDrawer");
this.navigationDrawer = navigationDrawer;
...
Fragment UpdateTopFragmentForCurrentMenu (Fragment newMenuRootFragment = null)
{
Fragment currentMenuRootFragment = navigationDrawer.CurrentFragment; // issued line.
但是现在将来的某个时候,MainMenuFragment
会使用其默认构造函数进行初始化,并且在第一次尝试访问其navigationDrawer时会抛出System.NullReferenceException
:
System.NullReferenceException: Object reference not set to an instance of an object
at MainMenuFragment.UpdateTopFragmentForCurrentMenu (Android.App.Fragment) <0x00018>
at MainMenuFragment.OpenMenu (IMenuType,bool) <0x0006b>
at MainMenuFragment.OnCreate (Android.OS.Bundle) <0x00053>
at Android.App.Fragment.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) <0x0005b>
at (wrapper dynamic-method) object.3919a6ec-60c1-49fd-b101-86191363dc45 (intptr,intptr,intptr) <0x00043>
如何在不面对此空引用异常的情况下实现默认构造函数?
答案 0 :(得分:6)
你的编程就像一个C#开发人员,这就是问题所在:)我面临同样的障碍学习monodroid。
看看那里的例子,在java中,你会看到几乎所有的时间他们使用静态方法初始化,如object.NewInstance()
返回object
。这是他们初始化他们的视图/接收器/片段的方式。此时,他们填充Arguments属性并将其存储在片段中。您需要删除所有构造函数,除了空构造函数,并使用参数传递数据。如果你尝试使用构造函数和常规oo概念来实现这一点,那么你将陷入一个受伤的世界。 Arguments.putExtra和所有这些方法都在那里。它让事情变得有点冗长,但是一旦掌握了它,你就会开始创建一些辅助方法等。
一旦你对它进行了排序,你需要弄清楚每次恢复活动时是否需要重新创建你的碎片,如果没有,将它们标记为RetainInstance = true
并将它们放到一个碎片管理器上帮助您保留所有州。
如果你没有建立在Android之前它很奇怪,当然不是我的预期。但它真的很酷,比我预期的要好得多。和Xamarin一样。
很相似的问题:Best practice for instantiating a new Android Fragment