微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在运行时使用 ChildFragmentManager 替换 Fragment 并且此片段没有 PagerSlidingTabStrip Xamarin.Android 的标题

如何解决如何在运行时使用 ChildFragmentManager 替换 Fragment 并且此片段没有 PagerSlidingTabStrip Xamarin.Android 的标题

我想在运行时使用其他片段更改寻呼机布局,但没有 PagerSlidingTabStrip 标题。我怎么能做到。 其次如何.我可以在另一个片段中调用方法 home Fragment。

这是家庭布局

     <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_marginBottom="50dp"
            android:id="@+id/SlidingStrips"
            android:layout_marginTop="10dp"
            android:layout_below="@id/AcountBalance">
     <com.refractored.PagerSlidingTabStrip
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:pstsPaddingMiddle="true"
        app:pstsDividerWidth="1dp"
        app:pstsDividerPadding="5dp"
        app:pstsDividerColor="#50FFFFFF"
        android:textColor="#50FFFFFF"
        app:pstsTextColorSelected="@android:color/white"
        app:pstsIndicatorColor="@android:color/white"
        app:pstsUnderlineColor="@android:color/white" />
<!--Change this to true if you want to center items-->
              
    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        tools:context=".HomeFragmentLayout" />
           
        </LinearLayout>

在这里添加片段的方式是与父片段一起添加的 ChildFragments 这两个片段添加了两个带有小时和日标签标签

 public class HomeFragment : Fragment,IOnTabReselectedListener,ViewPager.IOnPagechangelistener
    {
        View view;
        private MyPagerAdapter adapter;
        private int count = 1;
        private int currentColor;
        List<Android.Support.V4.App.Fragment> fragments = new List<Android.Support.V4.App.Fragment>();
        public static ViewPager pager;
        private PagerSlidingTabStrip tabs;

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

            // Create your fragment here
        }

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


        public override View OnCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)
        {

            base.OnCreateView(inflater,container,savedInstanceState);
            if (view == null)
            {
                view = inflater.Inflate(Resource.Layout.HomeFragmentLayout,false);
             
                return view;
            }
            else
            {

                return view;
            }

        
        }
        public override void OnViewCreated(View view,Bundle savedInstanceState)
        {
            base.OnViewCreated(view,savedInstanceState);
            try
            {
                fragments.Add(new HourlyFragment());
                fragments.Add(new DayFragment());
             
                adapter = new MyPagerAdapter(ChildFragmentManager,fragments);
                pager = view.FindViewById<ViewPager>(Resource.Id.pager);
                tabs = View.FindViewById<PagerSlidingTabStrip>(Resource.Id.tabs);
                pager.Adapter = adapter;
                tabs.SetViewPager(pager);

                var pageMargin = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip,4,Resources.displayMetrics);
                pager.PageMargin = pageMargin;
                pager.CurrentItem = 0;
                tabs.OnTabReselectedListener = this;
                tabs.OnPagechangelistener = this;
              
            }
            catch (System.Exception ex)
            {

               
            }
        
        }
       .// public  void ReplaceFragment(Fragment fragment)
        //{
        //    try
        //    {
        //        FragmentManager manager = ChildFragmentManager;
        //        FragmentTransaction transaction = manager.BeginTransaction();
        //        transaction.Add(Resource.Id.content_frame,fragment);
        //        transaction.Commit();
        //    }
        //    catch (System.Exception ex)
        //    {

               
        //    }


        //}

        public void OnTabReselected(int position)
        {
            Toast.MakeText(Context.ApplicationContext,"Tab reselected: " + position,ToastLength.Short).Show();
        }

        public void OnPageScrollStateChanged(int state)
        {
            Console.WriteLine("Page scroll state changed: " + state);
        }

        public void OnPageScrolled(int position,float positionOffset,int positionOffsetPixels)
        {
            Console.WriteLine("Page Scrolled");
        }

        public void OnPageSelected(int position)
        {
            Console.WriteLine("Page selected: " + position);
        }
        
    }

这是寻呼机适配器

public class MyPagerAdapter : FragmentPagerAdapter
    {
        List<Android.Support.V4.App.Fragment> fragments;
        private readonly string[] Titles =
        {
            "Hour","Day"
        };

        public MyPagerAdapter(FragmentManager fm,List<Android.Support.V4.App.Fragment> fragments) : base(fm)
        {
            this.fragments = fragments;

        }
        public override ICharSequence GetPageTitleFormatted(int position)
        {
      
            return new String(Titles[position]);
        }

   
        //}
        public override int Count { get { return fragments.Count; } }

        public override Fragment GetItem(int position)
        {
            return fragments[position];
        }

        public override long GetItemId(int position)
        {
            return base.GetItemId(position);
        }
       
}

解决方法

你可以像下面这样,假设你需要调用 HomeFragment 中的替换方法。

在您的 MyPagerAdapter 类中添加以下代码(如何在运行时替换片段):

private bool[] flags;
public override int GetItemPosition(Java.Lang.Object @object)
    {
        return PositionNone;
    }

public override Java.Lang.Object InstantiateItem(ViewGroup container,int position)
    {

        if (flags != null && flags[position])
        {
            /** Get the cached fragment and replace it with a new fragment*/
            Android.Support.V4.App.Fragment fragment = (Android.Support.V4.App.Fragment)base.InstantiateItem(container,position);
            string fragmentTag = fragment.Tag;
            Android.Support.V4.App.FragmentTransaction ft = fm.BeginTransaction();
            ft.Remove(fragment);
            fragment = fragments[position];
            ft.Add(container.Id,fragment,fragmentTag);
            ft.Attach(fragment);
            ft.Commit();
            /** Set to false when the replacement is complete*/
            flags[position] = false;
            if (fragment != null)
            {
                return fragment;
            }
            else
            {
                return base.InstantiateItem(container,position);
            }
        }
        else
        {
            return base.InstantiateItem(container,position);
        }

        
    }
  public void setFragments(List<Android.Support.V4.App.Fragment> fragments)
    {
        if (this.fragments != null)
        {
            flags = new bool[fragments.Count];
            for (int i = 0; i < fragments.Count; i++)
            {
                flags[i] = true;
            }
        }
        this.fragments = fragments;
        NotifyDataSetChanged();
    }

然后是 HomeFragment 中的替换方法:

  public void ReplaceFragment()
    {
        fragments[0] = new NewFragment(); //suppose you want to replace the first HourlyFragment
        fragments[1] = new DayFragment();
        adapter.setFragments(fragments);


    }

在其他片段(例如点击事件)中,您可以调用 HomeFragment 中的替换方法,例如:

 private void Button_Click(object sender,EventArgs e)
    {
        foreach (Android.Support.V4.App.Fragment fragment in Activity.SupportFragmentManager.Fragments)
        {
            if (fragment is HomeFragment)
            {
                ((HomeFragment)fragment).ReplaceFragment();
            }
        }
       
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。