Xamarin Android TabLayout向ViewPager添加片段而不是布局

雷姆科A

我是Android开发的新手,因此决定在xamarin android中制作一个tabLayout。我一切都正常了,但是唯一的问题是;我的ViewPager显示的是xml布局,而不是片段。

我现在无法对布局中的按钮执行任何操作,我尝试使用适配器等进行其他操作,但是似乎无法使其正常工作。

TabLayout是自定义的,其中包含LinearLayout和Horizo​​ntalScrollView。

我的MainActivity添加了整个tabLayout:

 public class MainActivity : Activity
{

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

        // Api getapi = new Api();
        // getapi.GetApi();

        // 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();

    }



}

带适配器和ViewPager的“我的片段”(只是夸大了丑陋的atm的布局):

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

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        var view = inflater.Inflate(Resource.Layout.fragment_sample, container, false);

        return view;
    }

    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("Surfboard kopen");
            items.Add("Surfboard customize");
            items.Add("Nieuwsbrief");
            items.Add("Contact");
            items.Add("FAQ");
        }

        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)
        {
            if (position == 4)
            {
                View view = LayoutInflater.From(container.Context).Inflate(Resource.Layout.Contact, container, false);
                container.AddView(view);

                return view;
            }

            if (position == 0)
            {
                View view = LayoutInflater.From(container.Context).Inflate(Resource.Layout.Home, container, false);
                container.AddView(view);

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

Main.axml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#E2E2E2"
        android:id="@+id/sample_main_layout">
        <FrameLayout
            android:id="@+id/sample_content_fragment"
            android:layout_weight="2"
            android:layout_width="match_parent"
            android:layout_height="0px" />
    </LinearLayout>

fragment_sample.axml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/backgroundd"
        android:src="@drawable/SurfChicks"
        android:scaleType="centerCrop"
        android:alpha="0.35" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <Smoothboard_Stylers_App.SlidingTabScrollView
            android:id="@+id/sliding_tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="0px"
            android:layout_weight="1" />
    </LinearLayout>
</RelativeLayout>

滚动视图:

namespace Smoothboard_Stylers_App
{
    public class SlidingTabScrollView : HorizontalScrollView
    {
        private const int TITLE_OFFSET_DIPS = 24;
        private const int TAB_VIEW_PADDING_DIPS = 16;
        private const int TAB_VIEW_TEXT_SIZE_SP = 12;

        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.Rgb(0xE5, 0xE5, 0xE5)); //Gray color

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

            mTabStrip = new SlidingTabStrip(context);
            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.Black);
                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.DefaultBold;

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

        }
    }
}

它是这样的:Image

非常感谢任何帮助,谢谢!

您应该FragmentPagerAdapter改用:

创建片段并在其OnCreate方法中添加xml

FragmentPagerAdapter应该看起来像这样:

public class MenuPagerAdapter : FragmentPagerAdapter
{
    private string[] Titles;
    private List<Android.Support.V4.App.Fragment> _fragments;
    Android.Support.V4.App.FragmentManager _fragmentManager;

    public MenuPagerAdapter(Android.Support.V4.App.FragmentManager fm, string[] titles)
        : base(fm)
    {
        Titles = titles;
        _fragments = new List<Android.Support.V4.App.Fragment>();
        _fragments.Add(new HomeFragment());
        _fragments.Add(new SurfboardKopenFragment());
        _fragments.Add(new NieuwsbriefFragment());
        _fragments.Add(new ContactFragment()); // and etc.
    }

    public override Android.Support.V4.App.Fragment GetItem(int position)
    {
        return _fragments[position];
    }

    public override ICharSequence GetPageTitleFormatted(int position)
    {

       return new Java.Lang.String(Titles[position]);
    }

    public override int Count
    {
        get { Titles.Length; } // amount of fragments you have = Amount of Tab titles.
    }

    public override int GetItemPosition(Java.Lang.Object objectValue)
    {
        return PositionNone;
    }

    public Android.Support.V4.App.Fragment GetFragment(int position)
    {
        return  _fragments[position];
    }
}

然后在您的活动或片段中初始化viewpager。

    private MenuPagerAdapter adapter;
    private CustomViewPager pager;
    void InitAdapter()
        {
           string[] titles = new []
                        { 
                            "Home",
                            "..."
                        }; 
            pager = FindViewById<CustomViewPager>(Resource.Id.pager);
            pager.EnableTouchEvents(true);
            adapter = new MenuPagerAdapter(SupportFragmentManager, titles); 
            var pageMargin = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 4, Resources.DisplayMetrics);
            pager.OffscreenPageLimit = titles.Length;//amount of fragments you want to stay in memory(for faster tab change) 
            pager.PageMargin = pageMargin;
            pager.AddOnPageChangeListener(this);
            pager.Adapter = adapter;
            pager.CurrentItem = 0;
        }

实现Android.Support.V4.View.ViewPager.IOnPageChangeListener您的片段或活动:

public void OnPageScrollStateChanged(int state)
    {
    }

    public void OnPageScrolled(int position, float positionOffset, int positionOffsetPixels)
    {
        // Do anything you like when page scrolls
    }

    public void OnPageSelected(int position)
    { // Do anything you like when tab is clicked. Position is clicked Tab position.
        switch (position)
        {
            case 0:
                break;
            case 1:
                break;
            case 2:
                break;
            case 3:
                break;
            case 4:
                break;
            case 5:
                break;
            default:
                break;
        }
    }

重要说明:您应该ChildFragmentManager在这里使用adapter = new MenuPagerAdapter(SupportFragmentManager, this, pager);而不是SupportFragmentManager如果您坚持要viewpager在片段中使用

重要建议:完全删除SlidingTabFragment所有内容并将其从那里移到MainActivity。

编辑:由于代码中的某些复制/粘贴错误,决定使用PagerSlidingTabStrip创建示例项目。玩得开心:PagerSlidingTabStrip-Sample

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

动态更改片段布局,而不是替换片段Android SDK

来自分类Dev

正在加载布局屏幕Xamarin android的图标

来自分类Dev

Xamarin.Android与Android

来自分类Dev

Xamarin.Android OnActivityResult没有在片段内被调用

来自分类Dev

Xamarin Android布局-行项目的透明背景

来自分类Dev

Xamarin Android-在片段中使用FragmentTabHost

来自分类Dev

Xamarin.android而不是Java

来自分类Dev

Xamarin Android片段TextView SetText

来自分类Dev

Xamarin Forms iOS和Android之间的文本布局差异

来自分类Dev

如何在Xamarin Android上的片段中设置actionBar?

来自分类Dev

Xamarin Android TabLayout向ViewPager添加片段而不是布局

来自分类Dev

动态更改片段布局,而不是替换片段Android SDK

来自分类Dev

以编程方式创建片段Android Xamarin

来自分类Dev

适用于Android的Xamarin ChatBubble布局

来自分类Dev

Android(Xamarin)特定的穿戴布局

来自分类Dev

片段xamarin android中未调用OnOptionsItemSelected

来自分类Dev

Android:片段或活动中的tablayout / viewpager片段

来自分类Dev

Xamarin Android-添加admob广告问题

来自分类Dev

Xamarin Android中的“全屏活动”中不显示布局

来自分类Dev

Xamarin Android布局问题

来自分类Dev

Xamarin Android片段库

来自分类Dev

Xamarin Android在片段内调用片段

来自分类Dev

Xamarin.Android CustomActionBar(Toolbar) 布局问题

来自分类Dev

添加自定义边框可绘制到 android 相对布局不显示 - Xamarin Forms

来自分类Dev

如何在 Xamarin Android 中的滑动选项卡布局中添加页面

来自分类Dev

如何使用片段中的相机在 xamarin android 中捕获图像

来自分类Dev

Xamarin android 在 ExpandableListView 中显示自定义布局

来自分类Dev

填充android布局xamarin

来自分类Dev

Xamarin Forms - 使用资源/布局中的相对布局的 Android 按钮

Related 相关文章

  1. 1

    动态更改片段布局,而不是替换片段Android SDK

  2. 2

    正在加载布局屏幕Xamarin android的图标

  3. 3

    Xamarin.Android与Android

  4. 4

    Xamarin.Android OnActivityResult没有在片段内被调用

  5. 5

    Xamarin Android布局-行项目的透明背景

  6. 6

    Xamarin Android-在片段中使用FragmentTabHost

  7. 7

    Xamarin.android而不是Java

  8. 8

    Xamarin Android片段TextView SetText

  9. 9

    Xamarin Forms iOS和Android之间的文本布局差异

  10. 10

    如何在Xamarin Android上的片段中设置actionBar?

  11. 11

    Xamarin Android TabLayout向ViewPager添加片段而不是布局

  12. 12

    动态更改片段布局,而不是替换片段Android SDK

  13. 13

    以编程方式创建片段Android Xamarin

  14. 14

    适用于Android的Xamarin ChatBubble布局

  15. 15

    Android(Xamarin)特定的穿戴布局

  16. 16

    片段xamarin android中未调用OnOptionsItemSelected

  17. 17

    Android:片段或活动中的tablayout / viewpager片段

  18. 18

    Xamarin Android-添加admob广告问题

  19. 19

    Xamarin Android中的“全屏活动”中不显示布局

  20. 20

    Xamarin Android布局问题

  21. 21

    Xamarin Android片段库

  22. 22

    Xamarin Android在片段内调用片段

  23. 23

    Xamarin.Android CustomActionBar(Toolbar) 布局问题

  24. 24

    添加自定义边框可绘制到 android 相对布局不显示 - Xamarin Forms

  25. 25

    如何在 Xamarin Android 中的滑动选项卡布局中添加页面

  26. 26

    如何使用片段中的相机在 xamarin android 中捕获图像

  27. 27

    Xamarin android 在 ExpandableListView 中显示自定义布局

  28. 28

    填充android布局xamarin

  29. 29

    Xamarin Forms - 使用资源/布局中的相对布局的 Android 按钮

热门标签

归档