Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android片段:继承与组合_Android_Android Fragments_Android Activity_Xamarin.android_Android Lifecycle - Fatal编程技术网

Android片段:继承与组合

Android片段:继承与组合,android,android-fragments,android-activity,xamarin.android,android-lifecycle,Android,Android Fragments,Android Activity,Xamarin.android,Android Lifecycle,简而言之,我试图在包装器类中包装一个片段,然后将包装器添加到视图页面。我以后在运行应用程序时遇到空指针问题(与从片段继承并将继承的片段添加到viewpager相反)。 说明 基本上,我正在向viewpager添加片段,在添加片段之前,我一直在继承它,并将其包装到另一个视图中,在其周围添加边框(页面拆分) 每个页面/片段都是一个不同的类,表示要显示的视图 这种方法的问题是我需要扩展每个片段并添加相同的样板功能,这并不理想。我也不想创建一个基类,比如说“boardered fragment”,因为

简而言之,我试图在包装器类中包装一个片段,然后将包装器添加到视图页面。我以后在运行应用程序时遇到空指针问题(与从片段继承并将继承的片段添加到viewpager相反)。


说明

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

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

这种方法的问题是我需要扩展每个片段并添加相同的样板功能,这并不理想。我也不想创建一个基类,比如说“boardered fragment”,因为当这些片段从它派生出来时,它们就会意识到boarder(我想)

所以,我想也许我会使用composition,在这里我会创建一个通用的包装类,它将包含一个类型为T的片段数据成员。问题是,我似乎无法将当前活动“activity”引用获取到片段数据成员(在包装中组成)的上下文中

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

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

    mFragment.OnSomething()
}
但这似乎没有帮助。我猜,因为合成的片段在当前活动上下文中是“隐藏”的,所以我需要手动执行所有必要的操作。我只是不确定他们都是什么

下面是一个快速的代码示例,说明了我要完成的工作,详细说明如下。如果需要更多的代码,请告诉我,我将把我的代码改编成示例格式


合成(在整个应用程序中有许多问题/空指针)

公共类Frag1:Fragment
{
...
}
公共课堂活动1:活动
{
创建时公共覆盖无效(捆绑包)
{
...
列表片段=新列表();
Add(FragmentWrapper.NewInstance(活动,类型(FragmentWrapper))
MyAdapter pagerAdapter=新的MyAdapter(碎片管理器,碎片);
ViewPager ViewPager=FindViewById(Resource.Id.view\u pager);
viewPager.Adapter=pagerAdapter;
}
公共类碎片包装器
{
Fragment MFFragment;//如何成功包装一个片段,但仍能正常工作????
公共静态FragmentWrapper NewInstance(活动,字符串类型)
{
FragmentWrapper ThisFragment=新的FragmentWrapper();
...
thisFrag.mffragment=Fragment.Instantiate(活动,类型);
归还此碎片;
}
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包)
{
//在mFragment周围添加boarder并返回新视图
}     
}
公共类MyAdapter:Android.Support.V13.App.FragmentStatePagerAdapter
{
....
}
}

继承(可以,ok)

公共类Frag1:Fragment
{
...
}
公共课堂活动1:活动
{
创建时公共覆盖无效(捆绑包)
{
...
列表片段=新列表();
添加(FragmentExtender.NewInstance(活动,类型(FragmentExtender))
MyAdapter pagerAdapter=新的MyAdapter(碎片管理器,碎片);
ViewPager ViewPager=FindViewById(Resource.Id.view\u pager);
viewPager.Adapter=pagerAdapter;
}
公共类FragmentExtender:Frag1
{
公共静态FragmentExtender NewInstance()
{
FragmentExtender ThisFragment=新的FragmentExtender();
...
归还此碎片;
}
创建视图上的公共覆盖视图(布局、充气机、视图组容器、捆绑包)
{
//在mFragment周围添加boarder并返回新视图
}
}     
公共类MyAdapter:Android.Support.V13.App.FragmentStatePagerAdapter
{
....
}
}


非常感谢您提供的任何帮助。谢谢。

如果您只想在片段之间添加边框,那么您应该签出。

如果您只想在片段之间添加边框,那么您应该签出。

通过阅读您的帖子,要真正理解您的问题和您的实际问题有点困难。您可以吗请对你的问题做一个总结,也许还可以概述一下你的“一句话”用粗体提问。这可能有助于澄清您的问题。谢谢prolink。我在顶部添加了一个粗体摘要。老实说,我认为人们看到了代码,没有晚上阅读顶部的第一句话(说明如下),也没有立即投反对票。我总是比较幸运地发布了我的问题摘要首先是问题,然后是详细描述,然后是代码和示例。这只是一般的好做法。很抱歉所有的否决票都没有评论。@prolink007没问题。我做过一次(可能两次,但不再做了)。知道首选格式很好,我希望我的问题尽可能容易阅读(我看到一些可怕的问题被遗忘了!)通过阅读你的帖子,要真正理解你的问题和你的实际问题有点困难。你能不能总结一下你的问题,也许能概括一下你的“一句话”用粗体表示的问题。这可能有助于澄清您的问题。谢谢您的prolink。我在顶部添加了一个用粗体表示的摘要。老实说,我认为人们正在看到代码,而不是您
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
    {
        ....
    }
}
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
    {
        ....
    }
}