summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs')
-rw-r--r--Xamarin.Forms.Platform.Android/AppCompat/FragmentContainer.cs111
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