Xamarin Forms - 如何从 Android 项目中的视图渲染器获取 Android.Support.V4.App.Fragment 管理器?

Xamarin Forms - How to get Android.Support.V4.App.Fragment Manager from View Renderer in Android project?

Xamarin Forms - 我在我的 android 项目中创建了一个自适应卡片自定义渲染器。为了调用自适应卡片渲染器功能,我需要传入片段管理器。如何从 View Renderer 获取片段管理器?

在Xamarin.Android项目中,我可以从片段class访问片段管理器。但是 Xamarin.Forms 我不知道该怎么做。

[assembly: ExportRenderer(typeof(BaseTemplate.CustomViews.AdaptiveCardLayout), typeof(BaseTemplate.Droid.Renderers.DroidAdaptiveCardLayoutRenderer))]

namespace BaseTemplate.Droid.Renderers
{
    public class DroidAdaptiveCardLayoutRenderer : ViewRenderer<AdaptiveCardLayout, Android.Views.View>, ICardActionHandler
    {
        public DroidAdaptiveCardLayoutRenderer(Context context) : base(context)
        {
        }

        public void OnAction(BaseActionElement p0, RenderedAdaptiveCard p1)
        {
            throw new NotImplementedException();
        }

        public void OnMediaPlay(BaseCardElement p0, RenderedAdaptiveCard p1)
        {
            throw new NotImplementedException();
        }

        public void OnMediaStop(BaseCardElement p0, RenderedAdaptiveCard p1)
        {
            throw new NotImplementedException();
        }

        protected override void OnElementChanged(ElementChangedEventArgs<AdaptiveCardLayout> e)
        {
            CardRendererImplementation cardRenderer = new CardRendererImplementation();
            ICardActionHandler cardActionHandler;
            Context context = Android.App.Application.Context;
            cardRenderer.Context = context;

            //how to get fragment manager here?
        }
    }
}

您可以使用 Context 转换为 activity。由于您的 DroidAdaptiveCardLayoutRenderer 具有默认构造函数,其中 context 作为参数。

试试这个代码:

var activity = Context as Activity;
activity.FragmentManager.BeginTransaction().Replace(Resource.Id.container, BasicFragment.NewInstance()).Commit();

对于 V4 使用:

using Android.Support.V7.App;

activity = Context as AppCompatActivity;
activity.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.container, BasicFragment.NewInstance()).Commit();

其实很简单!

你应该使用 CurrentActivity plugin setup here

完成此操作后,使用 Activity 属性

var appcompatActivity= CrossCurrentActivity.Current.Activity as AppCompatActivity;
var mFragManager= appcompatActivity.SupportFragmentManager;