Fixed tab not updating when page title is changed (#327)
authorJimmy Garrido <jimmygarrido@outlook.com>
Wed, 2 Nov 2016 18:09:55 +0000 (11:09 -0700)
committerE.Z. Hart <hartez@users.noreply.github.com>
Wed, 2 Nov 2016 18:09:55 +0000 (12:09 -0600)
* Fixed tab not updating when page title is changed

* Remove OnPagePropertyChanged Event From Pages When Disposing

* Meet coding standards and remove unnecessary parameters

Xamarin.Forms.Platform.Android/AppCompat/TabbedPageRenderer.cs

index 2fa1e44..211d248 100644 (file)
@@ -11,6 +11,7 @@ using Android.Support.Design.Widget;
 using Android.Support.V4.App;
 using Android.Support.V4.View;
 using Android.Views;
+using Xamarin.Forms.Internals;
 using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
 
 namespace Xamarin.Forms.Platform.Android.AppCompat
@@ -99,6 +100,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
                                                pageRenderer.ViewGroup.RemoveFromParent();
                                                pageRenderer.Dispose();
                                        }
+                                       pageToRemove.PropertyChanged -= OnPagePropertyChanged;
                                        pageToRemove.ClearValue(Android.Platform.RendererProperty);
                                }
 
@@ -167,19 +169,16 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
                                        pager.Id = FormsAppCompatActivity.GetUniqueId();
                                        pager.AddOnPageChangeListener(this);
 
-                                       tabs.SetupWithViewPager(pager);
-                                       UpdateTabIcons();
-                                       tabs.SetOnTabSelectedListener(this);
-
                                        AddView(pager);
                                        AddView(tabs);
+
+                                       OnChildrenCollectionChanged(null, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
                                }
 
                                TabbedPage tabbedPage = e.NewElement;
                                if (tabbedPage.CurrentPage != null)
                                        ScrollToCurrentPage();
 
-                               UpdateIgnoreContainerAreas();
                                ((IPageController)tabbedPage).InternalChildren.CollectionChanged += OnChildrenCollectionChanged;
                                UpdateBarBackgroundColor();
                                UpdateBarTextColor();
@@ -255,6 +254,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
 
                void OnChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
                {
+                       e.Apply((o, i, c) => SetupPage((Page)o), (o, i) => TeardownPage((Page)o), Reset);
+
                        FormsViewPager pager = _viewPager;
                        TabLayout tabs = _tabLayout;
 
@@ -277,6 +278,33 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
                        UpdateIgnoreContainerAreas();
                }
 
+               void TeardownPage(Page page)
+               {
+                       page.PropertyChanged -= OnPagePropertyChanged;
+               }
+
+               void SetupPage(Page page)
+               {
+                       page.PropertyChanged += OnPagePropertyChanged;
+               }
+
+               void Reset()
+               {
+                       foreach (var page in Element.Children)
+                               SetupPage(page);
+               }
+
+               void OnPagePropertyChanged(object sender, PropertyChangedEventArgs e)
+               {
+                       if (e.PropertyName == Page.TitleProperty.PropertyName)
+                       {
+                               var page = (Page)sender;
+                               var index = Element.Children.IndexOf(page);
+                               TabLayout.Tab tab = _tabLayout.GetTabAt(index);
+                               tab.SetText(page.Title);
+                       }
+               }
+
                void ScrollToCurrentPage()
                {
                        ((Platform)Element.Platform).NavAnimationInProgress = true;