4

我是Xamarin.Android的Android開發新手,我想了解如何解決下一個問題。Xamarin.Android中的默認構造函數

有時從後臺恢復我的Android應用程序後,我面臨的下一個錯誤: Unable to find the default constructor on type MainMenuFragment.MainMenuFragment使用應用程序NavigationDrawerActivity允許用戶在應用程序中不同的片段之間切換。

爲了解決這個問題,我添加了一個默認的構造函數的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> 

我怎麼能有沒有遇到這種空引用異常實現一個默認的構造?

回答

6

你正在編程就像一個C#開發人員,這就是問題所在:)我面臨這些學習monodroid的相同障礙。

看看這裏的例子,在java中,幾乎所有的時候他們都會使用靜態方法初始化,如object.NewInstance(),它返回object。這是他們如何初始化他們的視圖/接收器/片段。此時,他們填充Arguments屬性並將其存儲在片段中。您需要刪除所有構造函數,除了空的構造函數並使用參數傳遞數據。如果你試圖用構造函數和常規的oo概念來做到這一點,那麼你將會受到傷害。 Arguments.putExtra和所有這些方法都在那裏。它使事情有點冗長,但一旦你得到它的竅門,你會開始創建一些幫手方法等。

一旦你得到那個排序,你需要弄清楚,如果你需要重新創建你的片段,每次活動恢復,如果沒有,將它們標記爲RetainInstance = true,並將它們放到碎片管理器上,這將幫助您保留所有狀態。

如果你還沒有建立在android之前,它是奇怪的,當然不是我的預期。但它真的很酷,比我預期的還要棒。和Xamarin一樣。

非常相似的問題:Best practice for instantiating a new Android Fragment