首页 > 解决方案 > 使用片段嵌套选项卡移动选项卡

问题描述

我是 android 新手,尤其是 Xamarin Android C#。我有底部导航标签和片段。它们是fragment_picture(tab_picture)、fragment home(tab_home)、fragment通知(tab_notifications)、fragment_profile(tab_profile)。在 fragment_picture (tab_picture) 里面,我有 2 个标签。它们是 fragment_camera(tab_camera) 和 fragment_gallery(tab_gallery)。我想移动 fragment_picture 的选项卡,例如当我单击 tab_camera 时,它显示 tab_camera 的 XML,当我单击 tab_gallery 时,它显示 tab_gallery 的 XML。

我不使用viewpager。我只是使用片段。该选项卡不会将位置更改为其 XML。我在谷歌搜索了很多但是,我仍然感到困惑。请帮我

 using System;
    using Android.OS;
    using Android.Support.Design.Widget;
    using Android.Views;
    using Android.Support.V4.App;
    using Android.Widget;

namespace MyPhotographicMemory.Droid.Fragments
{
    public class Fragment_Picture : Fragment
    {
        TabLayout tabLayout;
        private TabLayout.Tab tabGallery, tabCamera;
        Fragment fragment = null;


        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

        }

        public static Fragment_Picture NewInstance()
        {
            var frag2 = new Fragment_Picture { Arguments = new Bundle() };
            return frag2;
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            var ignored = base.OnCreateView(inflater, container, savedInstanceState);
            var v = inflater.Inflate(Resource.Layout.FragmentPicture, null);

            tabLayout = v.FindViewById<TabLayout>(Resource.Id.pictureTabLayout);

            tabLayout.TabSelected += (object sender, TabLayout.TabSelectedEventArgs e) =>
            {
                switch (e.Tab.Position)
                {
                    case Resource.Layout.FragmentCamera: //Resource.Id.tabItem1
                        fragment = new Fragment_Camera();
                        TabLayout.Tab tab = tabLayout.GetTabAt(0);
                        tab.Select();
                        break;
                    case Resource.Layout.FragmentGallery: //Resource.Id.tabItem1
                        fragment = new Fragment_Gallery();
                        TabLayout.Tab tab1 = tabLayout.GetTabAt(1);
                        tab1.Select();
                        break;

                }

            };
            return v;
        }
}
}

标签: c#androidandroid-fragmentsxamarin.android

解决方案


你想达到这样的GIF效果吗?

在此处输入图像描述

如果是这样,您应该使用片段实现嵌套选项卡。

这是我在第一个片段中的代码。

   public class Fragment1 : Fragment
    {
        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Create your fragment here
        }

        public static Fragment1 NewInstance()
        {
            var frag1 = new Fragment1 { Arguments = new Bundle() };
            return frag1;
        }


        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            var ignored = base.OnCreateView(inflater, container, savedInstanceState);
            var view = inflater.Inflate(Resource.Layout.fragment1, null);
            BottomNavigationView bottomNavigationView= view.FindViewById<BottomNavigationView>(Resource.Id.mynested_bottom_navi);
            bottomNavigationView.NavigationItemSelected += BottomNavigationView_NavigationItemSelected;
            LoadFragment(Resource.Id.tab_camera);
            return view;
        }

        private void BottomNavigationView_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
        {
            LoadFragment(e.Item.ItemId);

        }
        //switch fragment by tab id.
        void LoadFragment(int id)
        {
           Fragment fragment = null;
            switch (id)
            {
                case Resource.Id.tab_gallery:
                    fragment = Fragment_Gallery.NewInstance();
                    break;
                case Resource.Id.tab_camera:
                    fragment = Fragment_Camera.NewInstance();
                    break;

            }
            if (fragment == null)
                return;

            FragmentManager.BeginTransaction()
               .Replace(Resource.Id.mynest_content_frame, fragment)
               .Commit();
        }
    }

这是我的demo,大家可以参考。 https://drive.google.com/file/d/1XZE6YopdsvDHY8-DwXBxRpHz3oFlJbOR/view


推荐阅读