0

我的Xamarin Android應用程序爲每個視圖使用片段而不是單獨的活動,其中一個片段需要包含一個用於照片滑塊的ViewPager。在Android 4.0和4.1中使用ViewPager/ChildFragmentManager

從我見過的一切中,ViewPager必須綁定到使用片段的適配器。這是有問題的,因爲這意味着我有一個片段內的片段,它必須使用ChildFragmentManager,而Android 4.2之前的版本不支持此片段。我的應用需要使用Android 4.0+,因此我需要有關如何解決此問題的指導。

我想過的某些行...

  1. 是否有一些其他類型的適配器的綁定到不使用片段一ViewPager的方法嗎?在我的情況下,我需要的是顯示一個ImageView作爲每個項目,所以一個片段似乎矯枉過正,顯然有4.2+問題。

  2. 除了ViewPager之外,是否還有其他一些控件可以在不依賴子碎片的情況下爲我提供所需的UX(左右滑動列表)?

  3. 有沒有辦法讓ChildFragmentManager與Android 4.0和4.1一起工作?

當前的代碼來設置ViewPager只有安卓4.2+支持:

<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; 
      } 
     } 
    } 

我只是用Xamarin 2天前開始,所以請溫柔。 :)

+0

改爲使用SupportFragmentManager。 – Cheesebaron

回答

1

我能夠通過使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; 
      } 
     } 
    } 
相關問題