blob: cc35b1a3b328a6c49b56c171629a783d04deddaf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
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;
Action<PageContainer> _onCreateCallback;
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 void SetOnCreateCallback(Action<PageContainer> callback)
{
_onCreateCallback = callback;
}
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);
_onCreateCallback?.Invoke(_pageContainer);
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();
}
public override void OnResume()
{
Page?.SendAppearing();
base.OnResume();
}
}
}
|