4

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

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

为了解决这个问题,我MainMenuFragment在下面的链接中描述了一个默认构造函数:

  • Xamarin 限制 - 2.1。缺少构造函数
  • 添加了默认构造函数,应该可以解决问题。

    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>

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

4

1 回答 1

7

您正在像 C# 开发人员一样编程,这就是问题所在:) 我在学习 monodroid 时遇到了同样的障碍。

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

完成排序后,您需要确定是否需要在每次恢复活动时重新创建片段,如果不需要,标记它们并将RetainInstance = true它们放入片段管理器中,这将帮助您保留所有状态。

如果你之前没有在 android 上构建过,那会很奇怪,而且肯定不是我所期望的。但它真的很酷,也比我预期的要棒得多。与 Xamarin 相同。

很好的类似问题:实例化新 Android 片段的最佳实践

于 2013-10-11T22:52:22.003 回答