Android片段:继承与组合

sam*_*mis 0 android xamarin.android android-lifecycle android-fragments android-activity

简而言之,我正在尝试将一个片段包装在一个包装类中,然后将包装器添加到视图寻呼机中.我在以后运行应用程序时遇到空指针问题(而不是从片段继承,并将继承的片段添加到viewpager).


描述

基本上,我正在向viewpager添加片段,在添加片段之前,我一直在继承它,并将其包装在另一个视图中,在它周围添加一个边界(页面分割).

每个页面/片段都是一个不同的类,表示要显示的视图.

这种方法的问题是我需要扩展每个片段并添加相同的样板功能,这是不理想的.我也不想创建一个基类,比如说"boardered-fragment",因为当它们从它衍生出来时(然后片段)就会知道它们(我认为).

所以,我想我也许只会使用组合,我将创建一个通用的包装类,它将包含一个类型为T的片段数据成员.这个问题是我似乎无法获得当前活动的"活动" "引用片段数据成员的上下文(在包装器中组成).

我做了一些临时调整并隐藏了getActivity(),它返回了我手动存储的活动引用的副本.然而程序崩溃是随机的(我怀疑它会).我已经尝试在我的包装器中覆盖所有可能的生命周期方法,然后在内部将在数据成员片段上调用该生命周期方法

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

    mFragment.OnSomething()
}
Run Code Online (Sandbox Code Playgroud)

但这似乎没有帮助.我猜测因为组合片段是从当前活动上下文"隐藏"的,所以我需要手动完成所有必要的操作.我只是不确定它们都是什么?

这是我正在尝试完成的快速代码示例,详细说明如下.如果需要更多代码,请告诉我,我将调整我的示例格式.


组合(在整个app中有很多问题/空指针)

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
    {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

继承(可以,好的)

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
    {
        ....
    }
}
Run Code Online (Sandbox Code Playgroud)

对此有任何帮助非常感谢.谢谢.

小智 5

如果您想要的只是在片段之间添加边框,那么您应该检查ViewPager.setPageMargin()并且ViewPager.setPageMarginDrawable().