2016-08-31 3 views
0

슬라이딩 - 탭 레이아웃을 만들려고했습니다. 나는이 튜토리얼 Sliding Tab Layout 을 따라 좋았어요,하지만 난 그것을 선택하거나 페이스 북의 응용 프로그램처럼에 스크롤 할 때, 나는 또한 각각의로드 만들고 싶어 각 TabViewxamarin ViewPager Android

에 특정 레이아웃을로드하고 싶었다.

이유 ViewPager 의 각보기에 대한로드 너무 많은 시간이 걸릴하지 않고 클래스가 :

SlidingTabStrip

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.Graphics; 
using Android.Util; 

namespace SlidingTabLayoutTutorial 
{ 
    public class SlidingTabStrip : LinearLayout 
    { 
     //Copy and paste from here................................................................ 
     private const int DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS = 0; 
     private const byte DEFAULT_BOTTOM_BORDER_COLOR_ALPHA = 0X26; 
     private const int SELECTED_INDICATOR_THICKNESS_DIPS = 3; 
     private int[] INDICATOR_COLORS = { 0xffffff }; 
     private int[] DIVIDER_COLORS = { 0xffffff }; 

     private const int DEFAULT_DIVIDER_THICKNESS_DIPS = 1; 
     private const float DEFAULT_DIVIDER_HEIGHT = 0.5f; 

     //Bottom border 
     private int mBottomBorderThickness; 
     private Paint mBottomBorderPaint; 
     private int mDefaultBottomBorderColor; 

     //Indicator 
     private int mSelectedIndicatorThickness; 
     private Paint mSelectedIndicatorPaint; 

     //Divider 
     private Paint mDividerPaint; 
     private float mDividerHeight; 

     //Selected position and offset 
     private int mSelectedPosition; 
     private float mSelectionOffset; 

     //Tab colorizer 
     private SlidingTabScrollView.TabColorizer mCustomTabColorizer; 
     private SimpleTabColorizer mDefaultTabColorizer; 
     //Stop copy and paste here........................................................................ 

     //Constructors 
     public SlidingTabStrip (Context context) : this(context, null) 
     { } 

     public SlidingTabStrip (Context context, IAttributeSet attrs) : base(context, attrs) 
     { 
      SetWillNotDraw(false); 

      float density = Resources.DisplayMetrics.Density; 

      TypedValue outValue = new TypedValue(); 
      context.Theme.ResolveAttribute(Android.Resource.Attribute.ColorForeground, outValue, true); 
      int themeForeGround = outValue.Data; 
      mDefaultBottomBorderColor = SetColorAlpha(themeForeGround, DEFAULT_BOTTOM_BORDER_COLOR_ALPHA); 

      mDefaultTabColorizer = new SimpleTabColorizer(); 
      mDefaultTabColorizer.IndicatorColors = INDICATOR_COLORS; 
      mDefaultTabColorizer.DividerColors = DIVIDER_COLORS; 

      mBottomBorderThickness = (int)(DEFAULT_BOTTOM_BORDER_THICKNESS_DIPS * density); 
      mBottomBorderPaint = new Paint(); 
      mBottomBorderPaint.Color = GetColorFromInteger(0x1B729E); //Gray 

      mSelectedIndicatorThickness = (int)(SELECTED_INDICATOR_THICKNESS_DIPS * density); 
      mSelectedIndicatorPaint = new Paint(); 

      mDividerHeight = DEFAULT_DIVIDER_HEIGHT; 
      mDividerPaint = new Paint(); 
      mDividerPaint.StrokeWidth = (int)(DEFAULT_DIVIDER_THICKNESS_DIPS * density); 

     } 

     public SlidingTabScrollView.TabColorizer CustomTabColorizer 
     { 
      set 
      { 
       mCustomTabColorizer = value; 
       this.Invalidate(); 
      } 
     } 

     public int [] SelectedIndicatorColors 
     { 
      set 
      { 
       mCustomTabColorizer = null; 
       mDefaultTabColorizer.IndicatorColors = value; 
       this.Invalidate(); 
      } 
     } 

     public int [] DividerColors 
     { 
      set 
      { 
       mDefaultTabColorizer = null; 
       mDefaultTabColorizer.DividerColors = value; 
       this.Invalidate(); 
      } 
     } 

     private Color GetColorFromInteger(int color) 
     { 
      return Color.Rgb(Color.GetRedComponent(color), Color.GetGreenComponent(color), Color.GetBlueComponent(color)); 
     } 

     private int SetColorAlpha(int color, byte alpha) 
     { 
      return Color.Argb(alpha, Color.GetRedComponent(color), Color.GetGreenComponent(color), Color.GetBlueComponent(color)); 
     } 

     public void OnViewPagerPageChanged(int position, float positionOffset) 
     { 
      mSelectedPosition = position; 
      mSelectionOffset = positionOffset; 
      this.Invalidate(); 
     } 

     protected override void OnDraw(Canvas canvas) 
     { 
      int height = Height; 
      int tabCount = ChildCount; 
      int dividerHeightPx = (int)(Math.Min(Math.Max(0f, mDividerHeight), 1f) * height); 
      SlidingTabScrollView.TabColorizer tabColorizer = mCustomTabColorizer != null ? mCustomTabColorizer : mDefaultTabColorizer; 

      //Thick colored underline below the current selection 
      if (tabCount > 0) 
      { 
       View selectedTitle = GetChildAt(mSelectedPosition); 
       int left = selectedTitle.Left; 
       int right = selectedTitle.Right; 
       int color = tabColorizer.GetIndicatorColor(mSelectedPosition); 

       if (mSelectionOffset > 0f && mSelectedPosition < (tabCount - 1)) 
       { 
        int nextColor = tabColorizer.GetIndicatorColor(mSelectedPosition + 1); 
        if (color != nextColor) 
        { 
         color = blendColor(nextColor, color, mSelectionOffset); 
        } 

        View nextTitle = GetChildAt(mSelectedPosition + 1); 
        left = (int)(mSelectionOffset * nextTitle.Left + (1.0f - mSelectionOffset) * left); 
        right = (int)(mSelectionOffset * nextTitle.Right + (1.0f - mSelectionOffset) * right); 
       } 

       mSelectedIndicatorPaint.Color = GetColorFromInteger(color); 

       canvas.DrawRect(left, height - mSelectedIndicatorThickness, right, height, mSelectedIndicatorPaint); 

       //Creat vertical dividers between tabs 
       int separatorTop = (height - dividerHeightPx)/2; 
       for (int i = 0; i < ChildCount -1; i++) 
       { 
        View child = GetChildAt(i); 
        mDividerPaint.Color = GetColorFromInteger(tabColorizer.GetDividerColor(i)); 
        canvas.DrawLine(child.Right, separatorTop, child.Right, separatorTop + dividerHeightPx, mDividerPaint); 
       } 

       canvas.DrawRect(0, height - mBottomBorderThickness, Width, height, mBottomBorderPaint); 
      } 
     } 

     private int blendColor(int color1, int color2, float ratio) 
     { 
      float inverseRatio = 1f - ratio; 
      float r = (Color.GetRedComponent(color1) * ratio) + (Color.GetRedComponent(color2) * inverseRatio); 
      float g = (Color.GetGreenComponent(color1) * ratio) + (Color.GetGreenComponent(color2) * inverseRatio); 
      float b = (Color.GetBlueComponent(color1) * ratio) + (Color.GetBlueComponent(color2) * inverseRatio); 

      return Color.Rgb((int)r, (int)g, (int)b); 
     } 

     private class SimpleTabColorizer : SlidingTabScrollView.TabColorizer 
     { 
      private int[] mIndicatorColors; 
      private int[] mDividerColors; 

      public int GetIndicatorColor(int position) 
      { 
       return mIndicatorColors[position % mIndicatorColors.Length]; 
      } 

      public int GetDividerColor (int position) 
      { 
       return mDividerColors[position % mDividerColors.Length]; 
      } 

      public int[] IndicatorColors 
      { 
       set { mIndicatorColors = value; } 
      } 

      public int[] DividerColors 
      { 
       set { mDividerColors = value; } 
      } 
     } 
    } 
} 

SlidingTabScrollView

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.Support.V4.View; 
using Android.Util; 
using Android.Graphics; 

namespace SlidingTabLayoutTutorial 
{ 
    public class SlidingTabScrollView : HorizontalScrollView 
    { 

     private const int TITLE_OFFSET_DIPS = 15; 
     private const int TAB_VIEW_PADDING_DIPS = 15; 
     private const int TAB_VIEW_TEXT_SIZE_SP = 20; 

     private int mTitleOffset; 

     //private int mTabViewLayoutID; 
     //private int mTabViewTextViewID; 

     private ViewPager mViewPager; 
     private ViewPager.IOnPageChangeListener mViewPagerPageChangeListener; 

     private static SlidingTabStrip mTabStrip; 

     private int mScrollState; 

     public interface TabColorizer 
     { 
      int GetIndicatorColor(int position); 
      int GetDividerColor(int position); 
     } 

     public SlidingTabScrollView(Context context) : this(context, null) { } 

     public SlidingTabScrollView(Context context, IAttributeSet attrs) : this(context, attrs, 0) { } 

     public SlidingTabScrollView (Context context, IAttributeSet attrs, int defaultStyle) : base(context, attrs, defaultStyle) 
     { 
      //Disable the scroll bar 
      HorizontalScrollBarEnabled = false; 

      //Make sure the tab strips fill the view 
      FillViewport = true; 
      this.SetBackgroundColor(Android.Graphics.Color.ParseColor("#0078FF")); //Gray color 

      mTitleOffset = (int)(TITLE_OFFSET_DIPS * Resources.DisplayMetrics.Density); 

      mTabStrip = new SlidingTabStrip(context); 
      mTabStrip.WeightSum = 3; 
      this.AddView(mTabStrip, LayoutParams.MatchParent, LayoutParams.MatchParent); 
     } 

     public TabColorizer CustomTabColorizer 
     { 
      set { mTabStrip.CustomTabColorizer = value; } 
     } 

     public int [] SelectedIndicatorColor 
     { 
      set { mTabStrip.SelectedIndicatorColors = value; } 
     } 

     public int [] DividerColors 
     { 
      set { mTabStrip.DividerColors = value; } 
     } 

     public ViewPager.IOnPageChangeListener OnPageListener 
     { 
      set { mViewPagerPageChangeListener = value; } 
     } 

     public ViewPager ViewPager 
     { 
      set 
      { 
       mTabStrip.RemoveAllViews(); 

       mViewPager = value; 
       if (value != null) 
       { 
        value.PageSelected += value_PageSelected; 
        value.PageScrollStateChanged += value_PageScrollStateChanged; 
        value.PageScrolled += value_PageScrolled; 
        PopulateTabStrip(); 
       } 
      } 
     } 

     void value_PageScrolled(object sender, ViewPager.PageScrolledEventArgs e) 
     { 
      int tabCount = mTabStrip.ChildCount; 

      if ((tabCount == 0) || (e.Position < 0) || (e.Position >= tabCount)) 
      { 
       //if any of these conditions apply, return, no need to scroll 
       return; 
      } 

      mTabStrip.OnViewPagerPageChanged(e.Position, e.PositionOffset); 

      View selectedTitle = mTabStrip.GetChildAt(e.Position); 

      int extraOffset = (selectedTitle != null ? (int)(e.Position * selectedTitle.Width) : 0); 

      ScrollToTab(e.Position, extraOffset); 

      if (mViewPagerPageChangeListener != null) 
      { 
       mViewPagerPageChangeListener.OnPageScrolled(e.Position, e.PositionOffset, e.PositionOffsetPixels); 
      } 

     } 

     void value_PageScrollStateChanged(object sender, ViewPager.PageScrollStateChangedEventArgs e) 
     { 
      mScrollState = e.State; 

      if (mViewPagerPageChangeListener != null) 
      { 
       mViewPagerPageChangeListener.OnPageScrollStateChanged(e.State); 
      } 
     } 

     void value_PageSelected(object sender, ViewPager.PageSelectedEventArgs e) 
     { 
      if (mScrollState == ViewPager.ScrollStateIdle) 
      { 
       mTabStrip.OnViewPagerPageChanged(e.Position, 0f); 
       ScrollToTab(e.Position, 0); 

      } 

      if (mViewPagerPageChangeListener != null) 
      { 
       mViewPagerPageChangeListener.OnPageSelected(e.Position); 
      } 
     } 

     private void PopulateTabStrip() 
     { 
      PagerAdapter adapter = mViewPager.Adapter; 

      for (int i = 0; i < adapter.Count; i++) 
      { 
       TextView tabView = CreateDefaultTabView(Context); 
       tabView.Text = ((SlidingTabsFragment.SamplePagerAdapter)adapter).GetHeaderTitle(i); 
       tabView.SetTextColor(Android.Graphics.Color.White); 
       tabView.Tag = i; 
       tabView.Click += tabView_Click; 
       mTabStrip.AddView(tabView); 
      } 

     } 

     void tabView_Click(object sender, EventArgs e) 
     { 
      TextView clickTab = (TextView)sender; 
      int pageToScrollTo = (int)clickTab.Tag; 
      mViewPager.CurrentItem = pageToScrollTo; 
     } 

     private TextView CreateDefaultTabView(Android.Content.Context context) 
     { 
      TextView textView = new TextView(context); 
      textView.Gravity = GravityFlags.Center; 
      textView.SetTextSize(ComplexUnitType.Sp, TAB_VIEW_TEXT_SIZE_SP); 
      textView.Typeface = Android.Graphics.Typeface.Default; 
      textView.LayoutParameters = new LinearLayout.LayoutParams(0, LayoutParams.MatchParent, 1); 

      if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Honeycomb) 
      { 
       TypedValue outValue = new TypedValue(); 
       Context.Theme.ResolveAttribute(Android.Resource.Attribute.SelectableItemBackground, outValue, false); 
       textView.SetBackgroundResource(outValue.ResourceId); 
      } 

      if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.IceCreamSandwich) 
      { 
       textView.SetAllCaps(true); 
      } 

      int padding = (int)(TAB_VIEW_PADDING_DIPS * Resources.DisplayMetrics.Density); 
      textView.SetPadding(padding, padding, padding, padding); 

      return textView; 
     } 

     protected override void OnAttachedToWindow() 
     { 
      base.OnAttachedToWindow(); 

      if (mViewPager != null) 
      { 
       ScrollToTab(mViewPager.CurrentItem, 0); 
      } 
     } 

     private void ScrollToTab(int tabIndex, int extraOffset) 
     { 
      int tabCount = mTabStrip.ChildCount; 

      if (tabCount == 0 || tabIndex < 0 || tabIndex >= tabCount) 
      { 
       //No need to go further, dont scroll 
       return; 
      } 

      View selectedChild = mTabStrip.GetChildAt(tabIndex); 
      if (selectedChild != null) 
      { 
       int scrollAmountX = selectedChild.Left + extraOffset; 

       if (tabIndex >0 || extraOffset > 0) 
       { 
        scrollAmountX -= mTitleOffset; 
       } 

       this.ScrollTo(scrollAmountX, 0); 
      } 

     } 

    } 
} 

SlidingTabsFragment

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Util; 
using Android.Views; 
using Android.Widget; 
using Android.Support.V4.View; 

namespace SlidingTabLayoutTutorial 
{ 
    public class SlidingTabsFragment : Fragment 
    { 
     private SlidingTabScrollView mSlidingTabScrollView; 
     private ViewPager mViewPager; 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      return inflater.Inflate(Resource.Layout.fragment_sample, container, false); 
     } 
     public override void OnViewCreated(View view, Bundle savedInstanceState) 
     { 
      mSlidingTabScrollView = view.FindViewById<SlidingTabScrollView>(Resource.Id.sliding_tabs); 
      mViewPager = view.FindViewById<ViewPager>(Resource.Id.viewpager); 
      mViewPager.Adapter = new SamplePagerAdapter(); 
      mSlidingTabScrollView.ViewPager = mViewPager; 
     } 

     public class SamplePagerAdapter : PagerAdapter 
     { 
      List<string> items = new List<string>(); 

      public SamplePagerAdapter() : base() 
      { 
       items.Add("Home"); 
       items.Add("Sell"); 
       items.Add("Rent"); 
      } 

      public override int Count 
      { 
       get { return items.Count; } 
      } 

      public override bool IsViewFromObject(View view, Java.Lang.Object obj) 
      { 
       return view == obj; 
      } 

      public override Java.Lang.Object InstantiateItem(ViewGroup container, int position) 
      { 
       View view = LayoutInflater.From(container.Context).Inflate(Resource.Layout.pager_item, container, false); 
       container.AddView(view); 

       TextView txtTitle = view.FindViewById<TextView>(Resource.Id.item_title); 
       int pos = position + 1; 
       txtTitle.Text = pos.ToString(); 

       return view; 
      } 

      public string GetHeaderTitle (int position) 
      { 
       return items[position]; 
      } 

      public override void DestroyItem(ViewGroup container, int position, Java.Lang.Object obj) 
      { 
       container.RemoveView((View)obj); 
      } 
     } 
    } 
} 

MainActivity는

using System; 
using Android.App; 
using Android.Content; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.OS; 
using Android.Support.V4.View; 

namespace SlidingTabLayoutTutorial 
{ 
    [Activity(Label = "Sliding Tab Layout", MainLauncher = true, Icon = "@drawable/xs")] 
    public class MainActivity : Activity 
    { 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      // Set our view from the "main" layout resource 
      SetContentView(Resource.Layout.Main); 

      FragmentTransaction transaction = FragmentManager.BeginTransaction(); 
      SlidingTabsFragment fragment = new SlidingTabsFragment(); 
      transaction.Replace(Resource.Id.sample_content_fragment, fragment); 
      transaction.Commit(); 

     } 


     public override bool OnCreateOptionsMenu(IMenu menu) 
     { 
      MenuInflater.Inflate(Resource.Menu.actionbar_main, menu); 
      return base.OnCreateOptionsMenu(menu); 
     } 

    } 
} 

답변

0

나는이 같은 코드 뭔가에 추가 할 필요가 있다고 생각 : (OnCreateView()에서)

position는 => 어댑터에서 온다 ..

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      switch (position) 
      { 
       case 0: 
        view = (ViewGroup)inflater.Inflate(Resource.Layout.Page1, container, false); 
        break; 
       case 1: 
        view = (ViewGroup)inflater.Inflate(Resource.Layout.Page2, container, false); 
        btn_forexample = view.FindViewById<Button>(Resource.Id.btn_forexample); 
        break; 
       case 2: 
        view = (ViewGroup)inflater.Inflate(Resource.Layout.Page3, container, false); 
        break; 
       default: 
        view = (ViewGroup)inflater.Inflate(Resource.Layout.DefaultPage, container, false); 
        break; 
      } 

      return view; 
     } 

희망 하시겠습니까?)