Xamarin.Android中的默认构造函数

时间:2013-10-11 13:57:02

标签: xamarin.android nullreferenceexception default-constructor

我是使用Xamarin.Android进行Android开发的新手,我想了解如何解决下一个问题。

有时从后台恢复我的Android应用程序后,我遇到了下一个错误: Unable to find the default constructor on type MainMenuFragment.应用程序NavigationDrawerActivity使用MainMenuFragment来允许用户在应用程序内的不同片段之间切换。

为了解决这个问题,我在MainMenuFragment添加了一个默认构造函数,如下一个链接所述:

  • Xamarin Limitations - 2.1. Missing constructors
  • 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>

如何在不面对此空引用异常的情况下实现默认构造函数?

1 个答案:

答案 0 :(得分:6)

你的编程就像一个C#开发人员,这就是问题所在:)我面临同样的障碍学习monodroid。

看看那里的例子,在java中,你会看到几乎所有的时间他们使用静态方法初始化,如object.NewInstance()返回object。这是他们初始化他们的视图/接收器/片段的方式。此时,他们填充Arguments属性并将其存储在片段中。您需要删除所有构造函数,除了空构造函数,并使用参数传递数据。如果你尝试使用构造函数和常规oo概念来实现这一点,那么你将陷入一个受伤的世界。 Arguments.putExtra和所有这些方法都在那里。它让事情变得有点冗长,但是一旦掌握了它,你就会开始创建一些辅助方法等。

一旦你对它进行了排序,你需要弄清楚每次恢复活动时是否需要重新创建你的碎片,如果没有,将它们标记为RetainInstance = true并将它们放到一个碎片管理器上帮助您保留所有州。

如果你没有建立在Android之前它很奇怪,当然不是我的预期。但它真的很酷,比我预期的要好得多。和Xamarin一样。

很相似的问题:Best practice for instantiating a new Android Fragment