Android fragments 在Android 4.0和4.1中使用ViewPager/ChildFragmentManager

Android fragments 在Android 4.0和4.1中使用ViewPager/ChildFragmentManager,android-fragments,android-viewpager,xamarin.android,xamarin,Android Fragments,Android Viewpager,Xamarin.android,Xamarin,我的Xamarin Android应用程序对每个视图使用片段,而不是单独的活动,其中一个片段需要包含一个用于照片滑块的ViewPager 据我所见,ViewPager必须绑定到使用片段的适配器。这是有问题的,因为这意味着片段中有一个片段,必须使用ChildFragmentManager,Android 4.2之前的版本不支持它。我的应用程序需要在安卓4.0+上运行,所以我需要如何解决这个问题的指导 我的一些想法 有没有办法将其他类型的适配器绑定到不使用片段的ViewPager?在我的例子中,我所

我的Xamarin Android应用程序对每个视图使用片段,而不是单独的活动,其中一个片段需要包含一个用于照片滑块的ViewPager

据我所见,ViewPager必须绑定到使用片段的适配器。这是有问题的,因为这意味着片段中有一个片段,必须使用ChildFragmentManager,Android 4.2之前的版本不支持它。我的应用程序需要在安卓4.0+上运行,所以我需要如何解决这个问题的指导

我的一些想法

  • 有没有办法将其他类型的适配器绑定到不使用片段的ViewPager?在我的例子中,我所需要的只是将一个ImageView显示为每个项目,因此一个片段似乎有些过分,显然有4.2+的问题

  • 除了ViewPager之外,我还可以使用其他控件来提供所需的UX(左/右滑动的照片列表),而不依赖于子片段吗

  • 有没有办法让ChildFragmentManager与Android 4.0和4.1配合使用

  • 仅支持Android 4.2+的ViewPager当前代码:

    <android.support.v4.view.ViewPager
            android:layout_width="match_parent"
            android:layout_height="200dip"
            android:id="@+id/property_details_image_gallery" />
    
    private ViewPager gallery;
    gallery = view.FindViewById<ViewPager> (Resource.Id.property_details_image_gallery);
    gallery.Adapter = new ImagePagerAdapter (ChildFragmentManager, 0, facts.PhotoUris);
    gallery.SetOnPageChangeListener (this);
    
    public class ImagePagerAdapter : FragmentPagerAdapter
        {
            private int resourceId;
            private List<string> photos;
    
            public ImagePagerAdapter (FragmentManager fragmentManager, int resourceId, List<string> photos) : base(fragmentManager)
            {
                this.resourceId = resourceId;
                this.photos = photos;
                if (photos.Count == 0)
                    photos.Add (string.Empty); // If there are no photos, we add a single photo that will result in a 'noimage' photo
            }
    
            public override Fragment GetItem (int position)
            {
                // Instantiate a new fragment
                ImageGalleryFragment fragment = new ImageGalleryFragment (photos[position], position);
                return fragment;
            }
    
            public override long GetItemId (int position)
            {
                return position;
            }
    
            public override int Count {
                get {
                    return photos.Count;
                }
            }
        }
    
    
    私人寻呼机图库;
    gallery=view.findviewbyd(Resource.Id.property\u details\u image\u gallery);
    gallery.Adapter=newImagePageRadapter(ChildFragmentManager,0,facts.PhotoUris);
    gallery.SetOnPageChangeListener(此);
    公共类ImagePagerAdapter:FragmentPagerAdapter
    {
    私有资源ID;
    私人名单照片;
    公共ImagePagerAdapter(FragmentManager FragmentManager,int resourceId,列表照片):基本(FragmentManager)
    {
    this.resourceId=resourceId;
    this.photos=照片;
    如果(photos.Count==0)
    photos.Add(string.Empty);//如果没有照片,我们将添加一张照片,这将导致“noimage”照片
    }
    公共重写片段GetItem(int位置)
    {
    //实例化一个新片段
    ImageGalleryFragment=新的ImageGalleryFragment(照片[位置],位置);
    返回片段;
    }
    公共覆盖长GetItemId(int位置)
    {
    返回位置;
    }
    公共覆盖整数计数{
    得到{
    返回照片。计数;
    }
    }
    }
    

    我3天前才开始使用Xamarin,所以请温柔点。:)

    我可以通过让ImagePagerAdapter直接从PagerAdapter继承来实现这一点

    public class ImagePagerAdapter : PagerAdapter {
            private List<string> data;
            private Context context;
    
            public ImagePagerAdapter(Context context, List<string> data) {
                this.context = context;
                this.data = data;
            }
    
            public override Java.Lang.Object InstantiateItem(View collection, int position) {
                // Create new image view
                var uri = data [position];
                var imageView = new ImageView(context);
                var defaultImage = context.Resources.GetDrawable (Resource.Drawable.noimage);
                imageView.SetUrlDrawable (uri, defaultImage);
                // Add image view to pager
                var viewPager = collection as ViewPager;
                viewPager.AddView(imageView);
                return imageView;
            }
    
            public override void DestroyItem(View collection, int position, Java.Lang.Object view) {
                var viewPager = collection as ViewPager;
                viewPager.RemoveView(view as View);
            }
    
            public override bool IsViewFromObject(View view, Java.Lang.Object obj) {
                return view == obj;
            }
    
            public override IParcelable SaveState() {
                return null;
            }
    
            public override void StartUpdate(View arg0) {
            }
    
            public override void FinishUpdate(View arg0) {
            }
    
            public override int Count {
                get {
                    return data != null ? data.Count : 0;
                }
            }
        }
    
    公共类ImagePagerAdapter:PagerAdapter{
    私人名单数据;
    私人语境;
    公共ImagePagerAdapter(上下文、列表数据){
    this.context=上下文;
    这个数据=数据;
    }
    public override Java.Lang.Object实例化项(视图集合,int位置){
    //创建新的图像视图
    var uri=数据[位置];
    var imageView=新的imageView(上下文);
    var defaultImage=context.Resources.GetDrawable(Resource.Drawable.noimage);
    imageView.SetUrlDrawable(uri,defaultImage);
    //将图像视图添加到寻呼机
    var viewPager=作为viewPager的集合;
    viewPager.AddView(imageView);
    返回图像视图;
    }
    公共覆盖项(视图集合、int位置、Java.Lang.Object视图){
    var viewPager=作为viewPager的集合;
    viewPager.RemoveView(视图为视图);
    }
    public override bool IsViewFromObject(视图,Java.Lang.Object obj){
    返回视图==obj;
    }
    public override iparceable SaveState(){
    返回null;
    }
    公共覆盖无效启动日期(视图arg0){
    }
    公共覆盖无效FinishUpdate(视图arg0){
    }
    公共覆盖整数计数{
    得到{
    返回数据!=null?数据。计数:0;
    }
    }
    }
    
    改用SupportFragmentManager。