使用 TabLayout 时 ViewPager 不加载片段

ViewPager not Loading Fragments when using TabLayout

我用 TabLayoutPageViewer 得到了一个简单的布局,但无法让它们一起工作

   <com.google.android.material.tabs.TabLayout
    android:id="@+id/sliding_tabs_emoji"    
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        app:tabMode="scrollable"
        app:tabGravity="fill"    
        app:tabIndicatorColor="@color/gray"
        app:tabIndicatorHeight="1dp"
        android:paddingBottom="2dp"/>
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewpager_emoji"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/red"/>

在我的ActivityOnCreate下面初始化

//Fragment array
            var fragments = new AndroidX.Fragment.App.Fragment[]
            {
                Library.Fun.Emoji.Fragments.Recent.NewInstance(),
                Library.Fun.Emoji.Fragments.People.NewInstance(),               
            };
            //Tab title array
            var titles = Android.Runtime.CharSequence.ArrayFromStringArray(new[] {
                "Recent" ,
                "People"
            });

            var viewPager = FindViewById<ViewPager>(Resource.Id.viewpager_emoji);
            //viewpager holding fragment array and tab title text
            viewPager.Adapter = new EmojiTabsPagerAdapter(SupportFragmentManager, fragments, titles);            
            // Give the TabLayout the ViewPager
            TAB_Layout.SetupWithViewPager(viewPager);
            Toast.MakeText(this, "SET", ToastLength.Short);
            TAB_Layout.GetTabAt(0).SetIcon(Resource.Drawable.ic_camera);
            TAB_Layout.GetTabAt(1).SetIcon(Resource.Drawable.ic_camera);

其中 Adapter 很简单,可以如下所示

public class EmojiTabsPagerAdapter : FragmentPagerAdapter
    {
        private readonly AndroidX.Fragment.App.Fragment[] fragments;
        private readonly ICharSequence[] titles;

        public EmojiTabsPagerAdapter(AndroidX.Fragment.App.FragmentManager fm, AndroidX.Fragment.App.Fragment[] fragments, ICharSequence[] titles) : base(fm)
        {
            this.fragments = fragments;
            this.titles = titles;
        }
        public override int Count
        {
            get
            {
                return fragments.Length;
            }
        }

        public override AndroidX.Fragment.App.Fragment GetItem(int position)
        {          
            return fragments[position];            
        }
        public override ICharSequence GetPageTitleFormatted(int position)
        {
            //return titles[position];
            return null;
        }
    }

出现了标签页,但没有加载片段,结果如下

它应该在每个选项卡上加载 RECENT 和 PEOPLE 片段的位置,我的片段 XML 如下

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="300dp"    
   android:background="@color/green">
  <TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="RECENTS"/>
</RelativeLayout>

片段代码如下(最近)

public class Recent : AndroidX.Fragment.App.Fragment
    {
        public static Recent NewInstance()
        {
            var frag = new Recent { Arguments = new Bundle() };
            return frag;
        }

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

            // Create your fragment here
        }

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

知道我做错了什么吗?

迁移到 AndroidX 之前是否有效?

我认为您可能需要将 ChildFragmentManager 而不是 FragmentManager 传递给您的 PagerAdapter。

我使用两个片段:TabFragment1TabFragment2来测试。在您的代码中,您确实提供了关于 SetupWithViewPager.

的代码

下面的代码很适合我。

 void setupViewPager(Android.Support.V4.View.ViewPager viewPager)
    {
        var adapter = new Adapter(SupportFragmentManager);
        adapter.AddFragment(new TabFragment1(), "First Fragment");
        adapter.AddFragment(new TabFragment2(), "Second Fragment");
                   viewPager.Adapter = adapter;
        viewpager.Adapter.NotifyDataSetChanged();
        //viewpager.OffscreenPageLimit(4);
    }

在MainActivity中,您可以像下面这样设置。

  var tabLayout = FindViewById<TabLayout>(Resource.Id.tabs);
        tabLayout.SetupWithViewPager(viewpager);

您可以从link下载源文件:https://www.c-sharpcorner.com/article/xamarin-android-create-viewpager-tablayout-floatingactionbutton-supportacti/