在片段 Xamarin Android 中使用设备后退?

Using device back pressed in fragment Xamarin Android?

我有一个activity,从中调用了三个片段。现在,我想使用 Back Press 方法返回到 Xamarin.Android 中的上一个片段或屏幕?怎么样,我能做到吗??

这将完成工作:

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

    using Android.App;
    using Android.Content;
    using Android.OS;
    using Android.Runtime;
    using Android.Views;
    using Android.Widget;
    using SupportTolbar = Android.Support.V7.Widget.Toolbar;
    using Android.Support.V7.App;
    using Android.Support.V4.Widget;
    using Android.Graphics;
    using SupportFragment = Android.Support.V4.App.Fragment;
    using Android.Content.PM;
    using Android.Graphics.Drawables;
    using System.Threading.Tasks;
    using System.Net.Http;
    using Newtonsoft.Json;

    namespace App
    {
        [Activity(Label = "", Theme = "@style/MyTheme", ScreenOrientation = ScreenOrientation.Portrait)]
        public class HomeActivity : AppCompatActivity
        {

            //Views that switch the fragments 
            public ImageView _viewTab1;
            public ImageView _viewTab2;
            public ImageView _viewTab3;

            //fragmentContainer 
             private FrameLayout _frameLayoutFragmentContainer;
            //fragments 
            public SupportFragment _currentFragment;
            public SupportFragment _customFragment1;
            public SupportFragment _customFragment2;
            public SupportFragment _customFragment3;

            private Stack<SupportFragment> _StackFragment;



            protected async override void OnCreate(Bundle savedInstanceState)
            {
                base.OnCreate(savedInstanceState);
                SetContentView(Resource.Layout.Main);

                 _frameLayoutFragmentContainer = FindViewById<FrameLayout>(Resource.Id.frameContainer);

                //initialize views that switch fragments
                _viewTab1 = FindViewById<ImageView>(Resource.Id.viewTab1);
                _viewTab2 = FindViewById<ImageView>(Resource.Id.viewTab2);
                _viewTab3 = FindViewById<ImageView>(Resource.Id.viewTab3);

                //catch events on button click what ever is the thing that switches the fragments
                _viewTab1.SetOnClickListener(new TabOnClickListener(this));
                _viewTab2.SetOnClickListener(new TabOnClickListener(this));
                _viewTab3.SetOnClickListener(new TabOnClickListener(this));

               //create fragments
                _customFragment1 = new Fragment1();
                _customFragment3 = new Fragment2();
                _customFragment2 = new Fragment3();
                _currentFragment = _customFragment1;
                _StackFragment = new Stack<SupportFragment>();

                var trans = SupportFragmentManager.BeginTransaction();
                trans.Add(Resource.Id.frameContainer, _customFragment1, "First Fragment");
                trans.Commit();

            }

            public override void OnBackPressed()
            {

                base.OnBackPressed();
            }

            public void ReplaceFragment(SupportFragment fragment) {
                if (fragment.IsVisible)
                    return;
                var trans = SupportFragmentManager.BeginTransaction();
                trans.Replace(Resource.Id.frameContainer, fragment);
                trans.AddToBackStack(null);
                trans.Commit();

                _currentFragment = fragment;

        }

        }

        public class TabOnClickListener : Java.Lang.Object, View.IOnClickListener
        {
            private HomeActivity homeActivity;

            public TabOnClickListener(HomeActivity homeActivity)
            {
                this.homeActivity = homeActivity;
            }

            public void OnClick(View v)
            {

                switch (v.Id)
                {
                    case Resource.Id.viewTab1:
                        homeActivity.ReplaceFragment(homeActivity._customFragment1);
                        break;
                case Resource.Id.viewTab2:
                        homeActivity.ReplaceFragment(homeActivity._customFragment2);
                        break;
                case Resource.Id.viewTab3:
                        homeActivity.ReplaceFragment(homeActivity._customFragment3);
                        break;

                }
            }
        }
    }

我做了静态委托:

static class FragmentOnBackRouter
    {
        public static Action RegisteredAction { get; set; }
    }

我在这里使用的是:

public override void OnBackPressed()
        {
            if (FragmentOnBackRouter.RegisteredAction != null)
                FragmentOnBackRouter.RegisteredAction.Invoke();
            else
                base.OnBackPressed();
        }

然后您可以只分配委托 - 通常在片段的 OnStart 方法中分配它,然后在 OnStop 方法中传递 null。简单的。对于函数,只需使用泛型(类型 Function< T >)。

我不怎么使用活动(每个应用程序 2-3 个)所以它很容易,如果我必须处理更复杂的事情,您总是可以创建一些抽象 activity,在那里继承和覆盖 OnBackPressed。