Search code examples
xamarin.formsfragmentmanageradaptive-cards

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


Xamarin Forms - I have created one adaptive card custom renderer in my android project. In order to call the adaptive card renderer function, I need to pass in Fragment Manager. How can I get fragment manager from View Renderer?

In Xamarin.Android project, I can access fragment manager from fragment class. But Xamarin.Forms I have no idea of how to doing that.

[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?
        }
    }
}

Solution

  • You can use the Context to cast into activity. As your DroidAdaptiveCardLayoutRenderer have the default constructor with the context as a parameter.

    Try this Code:

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

    For V4 use:

    using Android.Support.V7.App;
    
    activity = Context as AppCompatActivity;
    activity.SupportFragmentManager.BeginTransaction().Replace(Resource.Id.container, BasicFragment.NewInstance()).Commit();