diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2017-06-22 16:33:03 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-06-22 23:33:03 +0100 |
commit | 075a6b370d1dce8f211264422723276411f98b85 (patch) | |
tree | ead4eeb9d5a0edf1fb9f9926c88dfd9510073bc7 /Xamarin.Forms.Platform.Android/AppCompat | |
parent | 330b5156164e7951e01bc2493f9ca54a2587783e (diff) | |
download | xamarin-forms-075a6b370d1dce8f211264422723276411f98b85.tar.gz xamarin-forms-075a6b370d1dce8f211264422723276411f98b85.tar.bz2 xamarin-forms-075a6b370d1dce8f211264422723276411f98b85.zip |
Set the Id field for Android Views created by Forms (#1004)
* Repro of modal-over-map-crash issue
* Automated test for maps modal crash
* Generate Ids for all Renderer Views on Android
* Add Ids for PageContainer and PageRenderer
* Remove TODO comment
* Verify fast renderers aren't disposed before querying Id
Diffstat (limited to 'Xamarin.Forms.Platform.Android/AppCompat')
6 files changed, 11 insertions, 21 deletions
diff --git a/Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs index 766ee225..f50815d2 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/CarouselPageRenderer.cs @@ -94,7 +94,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent), Adapter = new FormsFragmentPagerAdapter<ContentPage>(e.NewElement, activity.SupportFragmentManager) { CountOverride = e.NewElement.Children.Count } }; - pager.Id = FormsAppCompatActivity.GetUniqueId(); + pager.Id = Platform.GenerateViewId(); pager.AddOnPageChangeListener(this); ViewGroup.AddView(pager); diff --git a/Xamarin.Forms.Platform.Android/AppCompat/FormsAppCompatActivity.cs b/Xamarin.Forms.Platform.Android/AppCompat/FormsAppCompatActivity.cs index 91efaa1d..b3b59433 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/FormsAppCompatActivity.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/FormsAppCompatActivity.cs @@ -461,23 +461,6 @@ namespace Xamarin.Forms.Platform.Android public static int ToolbarResource { get; set; } - internal static int GetUniqueId() - { - // getting unique Id's is an art, and I consider myself the Jackson Pollock of the field - if ((int)Build.VERSION.SdkInt >= 17) - return global::Android.Views.View.GenerateViewId(); - - // Numbers higher than this range reserved for xml - // If we roll over, it can be exceptionally problematic for the user if they are still retaining things, android's internal implementation is - // basically identical to this except they do a lot of locking we don't have to because we know we only do this - // from the UI thread - if (s_id >= 0x00ffffff) - s_id = 0x00000400; - return s_id++; - } - - static int s_id = 0x00000400; - #endregion } } diff --git a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailContainer.cs b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailContainer.cs index 50840926..faaf7462 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailContainer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailContainer.cs @@ -19,7 +19,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat public MasterDetailContainer(MasterDetailPage parent, bool isMaster, Context context) : base(parent, isMaster, context) { - Id = FormsAppCompatActivity.GetUniqueId(); + Id = Platform.GenerateViewId(); _parent = parent; _isMaster = isMaster; } diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs index 8d17db84..eb2da7a0 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs @@ -50,7 +50,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat public NavigationPageRenderer() { AutoPackage = false; - Id = FormsAppCompatActivity.GetUniqueId(); + Id = Platform.GenerateViewId(); Device.Info.PropertyChanged += DeviceInfoPropertyChanged; } diff --git a/Xamarin.Forms.Platform.Android/AppCompat/Platform.cs b/Xamarin.Forms.Platform.Android/AppCompat/Platform.cs index 03b23123..1ab45dfd 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/Platform.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/Platform.cs @@ -347,6 +347,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat Android.Platform.SetRenderer(modal, _renderer); AddView(_renderer.View); + + Id = Platform.GenerateViewId(); } protected override void Dispose(bool disposing) @@ -387,6 +389,11 @@ namespace Xamarin.Forms.Platform.Android.AppCompat } } + internal static int GenerateViewId() + { + return Android.Platform.GenerateViewId(); + } + #region Statics public static implicit operator ViewGroup(Platform canvas) diff --git a/Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs index bb14100d..78fc19cb 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs @@ -166,7 +166,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat LayoutParameters = new LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent), Adapter = new FormsFragmentPagerAdapter<Page>(e.NewElement, FragmentManager) { CountOverride = e.NewElement.Children.Count } }; - pager.Id = FormsAppCompatActivity.GetUniqueId(); + pager.Id = Platform.GenerateViewId(); pager.AddOnPageChangeListener(this); AddView(pager); |