blob: 4f95e4e5cb6d9411275c2440618329929586bfd0 (
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
|
using System.ComponentModel;
using Android.Views;
namespace Xamarin.Forms.Platform.Android
{
public class PageRenderer : VisualElementRenderer<Page>
{
public override bool OnTouchEvent(MotionEvent e)
{
base.OnTouchEvent(e);
return true;
}
IPageController PageController => Element as IPageController;
double _previousHeight;
protected override void Dispose(bool disposing)
{
PageController?.SendDisappearing();
base.Dispose(disposing);
}
protected override void OnAttachedToWindow()
{
base.OnAttachedToWindow();
var pageContainer = Parent as PageContainer;
if (pageContainer != null && (pageContainer.IsInFragment || pageContainer.Visibility == ViewStates.Gone))
return;
PageController.SendAppearing();
}
protected override void OnDetachedFromWindow()
{
base.OnDetachedFromWindow();
var pageContainer = Parent as PageContainer;
if (pageContainer != null && pageContainer.IsInFragment)
return;
PageController.SendDisappearing();
}
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
Page view = e.NewElement;
base.OnElementChanged(e);
if (Id == NoId)
{
Id = Platform.GenerateViewId();
}
UpdateBackgroundColor(view);
UpdateBackgroundImage(view);
Clickable = true;
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == Page.BackgroundImageProperty.PropertyName)
UpdateBackgroundImage(Element);
else if (e.PropertyName == VisualElement.BackgroundColorProperty.PropertyName)
UpdateBackgroundColor(Element);
else if (e.PropertyName == VisualElement.HeightProperty.PropertyName)
UpdateHeight();
}
void UpdateHeight()
{
// Handle size changes because of the soft keyboard (there's probably a more elegant solution to this)
// This is only necessary if:
// - we're navigating back from a page where the soft keyboard was open when the user hit the Navigation Bar 'back' button
// - the Application's content height has changed because WindowSoftInputModeAdjust was set to Resize
// - the height has increased (in other words, the last layout was with the keyboard open, and now it's closed)
var newHeight = Element.Height;
if (_previousHeight > 0 && newHeight > _previousHeight)
{
var nav = Element.Navigation;
// This update check will fire for all the pages on the stack, but we only need to request a layout for the top one
if (nav?.NavigationStack != null && nav.NavigationStack.Count > 0 && Element == nav.NavigationStack[nav.NavigationStack.Count - 1])
{
// The Forms layout stuff is already correct, we just need to force Android to catch up
RequestLayout();
}
}
// Cache the height for next time
_previousHeight = newHeight;
}
void UpdateBackgroundColor(Page view)
{
if (view.BackgroundColor != Color.Default)
SetBackgroundColor(view.BackgroundColor.ToAndroid());
}
void UpdateBackgroundImage(Page view)
{
if (!string.IsNullOrEmpty(view.BackgroundImage))
this.SetBackground(Context.Resources.GetDrawable(view.BackgroundImage));
}
}
}
|