總之,我試圖在一個包裝類中包裝一個片段,然後將包裝添加到視圖傳呼。我以後在運行應用程序時會遇到空指針問題(而不是從片段繼承,並將繼承的片段添加到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
{
....
}
}
任何幫助,這是非常感謝。謝謝。
從閱讀您的文章,實際上理解您的問題和實際問題有點困難。你能否提供一個關於你的問題的總結,並可能用** bold **來概括你的「1句話」問題。這可能有助於澄清你的問題。 – prolink007
謝謝prolink。我在頂部以粗體添加了一個摘要。說實話,我認爲人們看到的代碼,沒有讀晚上的第一句話,表明下面的描述,並立即downvoting。 – samosaris
我總是有更好的運氣,首先發布我的問題的總結,然後詳細描述,然後代碼和示例。一般而言,這只是一個好習慣。對不起,沒有評論的所有倒票。 – prolink007