0

總之,我試圖在一個包裝類中包裝一個片段,然後將包裝添加到視圖傳呼。我以後在運行應用程序時會遇到空指針問題(而不是從片段繼承,並將繼承的片段添加到viewpager中)。Android片段:繼承vs構成


說明

基本上,我添加片段到viewpager,以及將所述片段之前,我已經從它繼承,並且,增加了一個邊界另一視圖包裹它在它周圍(頁面分割)。

每個頁面/片段都是一個不同的類,它表示要顯示的視圖。

這種方法的問題是我需要擴展每個片段並添加相同的樣板功能,這並不理想。我也不想製作一個基本類,比如說「boardered-fragment」,因爲這樣當這些片斷從它派生出來的時候就會意識到這個邊界(我認爲)。

所以,我想,也許我只是使用組合,在那裏我會做一個通用的包裝類,它將包含一個片段數據成員類型爲T.與這個問題是,我似乎無法得到當前活動「活動」引用到片段數據成員的上下文中(由封裝器組成)。

我做了一些臨時調整並隱藏了getActivity(),它返回手動存儲的活動引用的副本。然而,程序崩潰是隨機的(正如我懷疑的那樣)。我試圖重寫我的包裝所有可能的壽命的方法,然後裏面會說這就是終身方法對數據成員片段

public override void OnSomething() 
{ 
    base.OnSomething() 

    mFragment.OnSomething() 
} 

,但似乎並沒有幫助。我猜測這是因爲組合片段從當前活動上下文中「隱藏」,因此我需要手動執行所有必要的操作。我只是不確定他們都是什麼?

以下是我正在努力完成的一個快速代碼示例,下面詳細闡述。請讓我知道是否需要更多的代碼,並且我會根據示例格式對其進行調整。


組成(有許多問題/ null的整個應用程序的指針)

public class Frag1 : Fragment 
{ 
    ... 
} 

public class Activity1 : Activity 
{ 
    public override void OnCreate(Bundle bundle) 
    { 
     ... 

     List<Fragment> fragments = new List<Fragment>(); 

     fragments.Add(FragmentWrapper.NewInstance(Activity, typeof(FragmentWrapper)) 

     MyAdapter pagerAdapter = new MyAdapter(FragmentManager, fragments);    
     ViewPager viewPager = FindViewById<ViewPager>(Resource.Id.view_pager); 
     viewPager.Adapter = pagerAdapter; 
    } 

    public class FragmentWrapper 
    { 
     Fragment mFragment; // How to successfully wrap a fragment, but still behave properly ???? 

     public static FragmentWrapper NewInstance(Activity activity, string type) 
     { 
      FragmentWrapper thisFrag = new FragmentWrapper(); 

      ... 

      thisFrag.mFragment = Fragment.Instantiate(activity, type); 

      return thisFrag; 
     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
     { 
      // add boarder around mFragment and return new view 
     }  
    } 

    public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter 
    { 
     .... 
    } 
} 

繼承(可以做,OK)

public class Frag1 : Fragment 
{ 
    ... 
} 

public class Activity1 : Activity 
{ 
    public override void OnCreate(Bundle bundle) 
    { 
     ... 

     List<Fragment> fragments = new List<Fragment>(); 

     fragments.Add(FragmentExtender.NewInstance(Activity, typeof(FragmentExtender)) 

     MyAdapter pagerAdapter = new MyAdapter(FragmentManager, fragments);    
     ViewPager viewPager = FindViewById<ViewPager>(Resource.Id.view_pager); 
     viewPager.Adapter = pagerAdapter; 
    } 

    public class FragmentExtender : Frag1 
    { 
     public static FragmentExtender NewInstance() 
     { 
      FragmentExtender thisFrag = new FragmentExtender(); 

      ... 

      return thisFrag; 
     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
     { 
      // add boarder around mFragment and return new view 
     } 
    }  

    public class MyAdapter : Android.Support.V13.App.FragmentStatePagerAdapter 
    { 
     .... 
    } 
} 

任何幫助,這是非常感謝。謝謝。

+1

從閱讀您的文章,實際上理解您的問題和實際問題有點困難。你能否提供一個關於你的問題的總結,並可能用** bold **來概括你的「1句話」問題。這可能有助於澄清你的問題。 – prolink007

+1

謝謝prolink。我在頂部以粗體添加了一個摘要。說實話,我認爲人們看到的代碼,沒有讀晚上的第一句話,表明下面的描述,並立即downvoting。 – samosaris

+0

我總是有更好的運氣,首先發布我的問題的總結,然後詳細描述,然後代碼和示例。一般而言,這只是一個好習慣。對不起,沒有評論的所有倒票。 – prolink007

回答