简而言之,我试图将一个片段包装在一个包装器类中,然后将包装器添加到视图寻呼机。我稍后在运行应用程序时遇到空指针问题(而不是从片段继承,并将继承的片段添加到 viewpager)。
描述
基本上,我将片段添加到 viewpager,在添加片段之前,我一直从它继承,并将它包装在另一个视图中,在它周围添加一个边界(页面拆分)。
每个页面/片段都是一个不同的类,代表要显示的视图。
这种方法的问题是我需要扩展每个片段并添加相同的样板功能,这并不理想。我也不想创建一个基类,说“寄宿片段”,因为当片段从它派生时,它们就会意识到寄宿生(我认为)。
所以,我想也许我会使用组合,在那里我会创建一个通用包装类,它将包含一个类型为 T 的片段数据成员。问题是我似乎无法获得当前的活动“活动" 引用片段数据成员的上下文(由包装器组成)。
我做了一些临时调整并隐藏了返回我手动存储的活动引用副本的 getActivity()。然而程序崩溃是随机的(正如我所怀疑的那样)。我已经尝试在包装器中覆盖所有可能的生命周期方法,然后在内部将在数据成员片段上调用该生命周期方法
public override void OnSomething()
{
base.OnSomething()
mFragment.OnSomething()
}
但这似乎没有帮助。我猜是因为组合片段是从当前活动上下文中“隐藏”的,所以我需要手动完成所有必要的操作。我只是不确定它们都是什么?
这是我正在尝试完成的快速代码示例,详细说明如下。如果需要更多代码,请告诉我,我会将我所拥有的内容调整为示例格式。
组合(在整个应用程序中有许多问题/空指针)
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
{
....
}
}
对此的任何帮助都非常感谢。谢谢。