diff options
Diffstat (limited to 'Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs b/Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs new file mode 100644 index 00000000..39219188 --- /dev/null +++ b/Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs @@ -0,0 +1,111 @@ +using System; +using Android.OS; +using Android.Runtime; +using Android.Support.V4.App; +using Android.Views; +using AView = Android.Views.View; + +namespace Xamarin.Forms.Platform.Android.AppCompat +{ + internal class FragmentContainer : Fragment + { + readonly WeakReference _pageReference; + + bool? _isVisible; + PageContainer _pageContainer; + IVisualElementRenderer _visualElementRenderer; + + public FragmentContainer() + { + } + + public FragmentContainer(Page page) : this() + { + _pageReference = new WeakReference(page); + } + + protected FragmentContainer(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) + { + } + + public Page Page => (Page)_pageReference?.Target; + + public override bool UserVisibleHint + { + get { return base.UserVisibleHint; } + set + { + base.UserVisibleHint = value; + if (_isVisible == value) + return; + _isVisible = value; + if (_isVisible.Value) + Page?.SendAppearing(); + else + Page?.SendDisappearing(); + } + } + + public static Fragment CreateInstance(Page page) + { + return new FragmentContainer(page) { Arguments = new Bundle() }; + } + + public override AView OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) + { + if (Page != null) + { + _visualElementRenderer = Android.Platform.CreateRenderer(Page, ChildFragmentManager); + Android.Platform.SetRenderer(Page, _visualElementRenderer); + + _pageContainer = new PageContainer(Forms.Context, _visualElementRenderer, true); + return _pageContainer; + } + + return null; + } + + public override void OnDestroyView() + { + if (Page != null) + { + IVisualElementRenderer renderer = _visualElementRenderer; + PageContainer container = _pageContainer; + + if (container.Handle != IntPtr.Zero && renderer.ViewGroup.Handle != IntPtr.Zero) + { + container.RemoveFromParent(); + renderer.ViewGroup.RemoveFromParent(); + Page.ClearValue(Android.Platform.RendererProperty); + + container.Dispose(); + renderer.Dispose(); + } + } + + _visualElementRenderer = null; + _pageContainer = null; + + base.OnDestroyView(); + } + + public override void OnHiddenChanged(bool hidden) + { + base.OnHiddenChanged(hidden); + + if (Page == null) + return; + + if (hidden) + Page.SendDisappearing(); + else + Page.SendAppearing(); + } + + public override void OnPause() + { + Page?.SendDisappearing(); + base.OnPause(); + } + } +}
\ No newline at end of file |