void RegisterToolbar() { Context context = Context; AToolbar bar = _toolbar; Element page = Element.RealParent; _flyoutPage = null; while (page != null) { if (page is FlyoutPage) { _flyoutPage = page as FlyoutPage; break; } page = page.RealParent; } if (_flyoutPage == null) { if (PageController.InternalChildren.Count > 0) { _flyoutPage = PageController.InternalChildren[0] as FlyoutPage; } if (_flyoutPage == null) { return; } } if (((IFlyoutPageController)_flyoutPage).ShouldShowSplitMode) { return; } var renderer = APlatform.GetRenderer(_flyoutPage) as FlyoutPageRenderer; if (renderer == null) { return; } _drawerLayout = renderer; Controls.Platform.AutomationPropertiesProvider.GetDrawerAccessibilityResources(context, _flyoutPage, out int resourceIdOpen, out int resourceIdClose); if (_drawerToggle != null) { _drawerToggle.ToolbarNavigationClickListener = null; _drawerToggle.Dispose(); } _drawerToggle = new ActionBarDrawerToggle(context.GetActivity(), _drawerLayout, bar, resourceIdOpen == 0 ? global::Android.Resource.String.Ok : resourceIdOpen, resourceIdClose == 0 ? global::Android.Resource.String.Ok : resourceIdClose) { ToolbarNavigationClickListener = new ClickListener(Element) }; if (_drawerListener != null) { _drawerLayout.RemoveDrawerListener(_drawerListener); _drawerListener.Dispose(); } _drawerListener = new DrawerMultiplexedListener { Listeners = { _drawerToggle, renderer } }; _drawerLayout.AddDrawerListener(_drawerListener); }
void UpdateToolbar() { if (_disposed) { return; } Context context = Context; AToolbar bar = _toolbar; ActionBarDrawerToggle toggle = _drawerToggle; if (bar == null) { return; } bool isNavigated = NavigationPageController.StackDepth > 1; bar.NavigationIcon = null; Page currentPage = Element.CurrentPage; if (isNavigated) { if (NavigationPage.GetHasBackButton(currentPage)) { if (toggle != null) { toggle.DrawerIndicatorEnabled = false; toggle.SyncState(); } var icon = new DrawerArrowDrawable(context.GetThemedContext()); icon.Progress = 1; bar.NavigationIcon = icon; var prevPage = Element.Peek(1); var backButtonTitle = NavigationPage.GetBackButtonTitle(prevPage); _defaultNavigationContentDescription = backButtonTitle != null ? bar.SetNavigationContentDescription(prevPage, backButtonTitle) : bar.SetNavigationContentDescription(prevPage, _defaultNavigationContentDescription); } else if (toggle != null && _flyoutPage != null) { toggle.DrawerIndicatorEnabled = _flyoutPage.ShouldShowToolbarButton(); toggle.SyncState(); } } else { if (toggle != null && _flyoutPage != null) { toggle.DrawerIndicatorEnabled = _flyoutPage.ShouldShowToolbarButton(); toggle.SyncState(); } } Color tintColor = Element.BarBackgroundColor; if (tintColor == null) { bar.BackgroundTintMode = null; } else { bar.BackgroundTintMode = PorterDuff.Mode.Src; bar.BackgroundTintList = ColorStateList.ValueOf(tintColor.ToAndroid()); } Brush barBackground = Element.BarBackground; bar.UpdateBackground(barBackground); Color textColor = Element.BarTextColor; if (textColor != null) { bar.SetTitleTextColor(textColor.ToAndroid().ToArgb()); } Color navIconColor = NavigationPage.GetIconColor(Current); if (navIconColor != null && bar.NavigationIcon != null) { bar.NavigationIcon.SetColorFilter(navIconColor, FilterMode.SrcAtop); } bar.Title = currentPage?.Title ?? string.Empty; if (_toolbar.NavigationIcon != null && textColor != null) { var icon = _toolbar.NavigationIcon as DrawerArrowDrawable; if (icon != null) { icon.Color = textColor.ToAndroid().ToArgb(); } } UpdateTitleIcon(); UpdateTitleView(); }
protected override void Dispose(bool disposing) { if (_disposed) { return; } _disposed = true; if (disposing) { DeviceDisplay.MainDisplayInfoChanged -= DeviceInfoPropertyChanged; if (NavigationPageController != null) { var navController = NavigationPageController; navController.PushRequested -= OnPushed; navController.PopRequested -= OnPopped; navController.PopToRootRequested -= OnPoppedToRoot; navController.InsertPageBeforeRequested -= OnInsertPageBeforeRequested; navController.RemovePageRequested -= OnRemovePageRequested; } if (Current != null) { Current.PropertyChanged -= CurrentOnPropertyChanged; } FragmentManager fm = FragmentManager; if (!fm.IsDestroyed) { FragmentTransaction trans = fm.BeginTransactionEx(); foreach (Fragment fragment in _fragmentStack) { trans.RemoveEx(fragment); } trans.CommitAllowingStateLossEx(); fm.ExecutePendingTransactionsEx(); } _toolbar.RemoveView(_titleView); _titleView?.Dispose(); _titleView = null; if (_titleViewRenderer != null) { Platform.ClearRenderer(_titleViewRenderer.View); _titleViewRenderer.Dispose(); _titleViewRenderer = null; } _toolbar.RemoveView(_titleIconView); _titleIconView?.Dispose(); _titleIconView = null; _imageSource = null; if (_toolbarTracker != null) { _toolbarTracker.CollectionChanged -= ToolbarTrackerOnCollectionChanged; _toolbar.DisposeMenuItems(_currentToolbarItems, OnToolbarItemPropertyChanged); _toolbarTracker.Target = null; _toolbarTracker = null; } if (_currentMenuItems != null) { _currentMenuItems.Clear(); _currentMenuItems = null; } if (_currentToolbarItems != null) { _currentToolbarItems.Clear(); _currentToolbarItems = null; } if (_toolbar != null) { _toolbar.SetNavigationOnClickListener(null); _toolbar.Menu.Clear(); RemoveView(_toolbar); _toolbar.Dispose(); _toolbar = null; } if (_drawerLayout.IsAlive() && _drawerListener.IsAlive()) { _drawerLayout.RemoveDrawerListener(_drawerListener); RemoveView(_drawerLayout); } if (_drawerListener != null) { _drawerListener.Dispose(); _drawerListener = null; } if (_drawerToggle != null) { _drawerToggle.ToolbarNavigationClickListener = null; _drawerToggle.Dispose(); _drawerToggle = null; } if (_backgroundDrawable != null) { _backgroundDrawable.Dispose(); _backgroundDrawable = null; } Current = null; // We dispose the child renderers after cleaning up everything related to DrawerLayout in case // one of the children is a FlyoutPage (which may dispose of the DrawerLayout). if (Element != null) { foreach (Element element in PageController.InternalChildren) { var child = element as VisualElement; if (child == null) { continue; } IVisualElementRenderer renderer = Platform.GetRenderer(child); renderer?.Dispose(); } } } base.Dispose(disposing); }
void UpdateToolbar() { if (_disposed) { return; } Context context = Context; AToolbar bar = _toolbar; ActionBarDrawerToggle toggle = _drawerToggle; if (bar == null) { return; } bool isNavigated = NavigationPageController.StackDepth > 1; bar.NavigationIcon = null; Page currentPage = Element.CurrentPage; if (isNavigated) { if (NavigationPage.GetHasBackButton(currentPage) && !Context.IsDesignerContext()) { if (toggle != null) { toggle.DrawerIndicatorEnabled = false; toggle.SyncState(); } var activity = (AppCompatActivity)context.GetActivity(); var icon = new DrawerArrowDrawable(activity.SupportActionBar.ThemedContext); icon.Progress = 1; bar.NavigationIcon = icon; var prevPage = Element.Peek(1); _defaultNavigationContentDescription = bar.SetNavigationContentDescription(prevPage, _defaultNavigationContentDescription); } else if (toggle != null && _masterDetailPage != null) { toggle.DrawerIndicatorEnabled = _masterDetailPage.ShouldShowToolbarButton(); toggle.SyncState(); } } else { if (toggle != null && _masterDetailPage != null) { toggle.DrawerIndicatorEnabled = _masterDetailPage.ShouldShowToolbarButton(); toggle.SyncState(); } } Color tintColor = Element.BarBackgroundColor; if (Forms.IsLollipopOrNewer) { if (tintColor.IsDefault) { bar.BackgroundTintMode = null; } else { bar.BackgroundTintMode = PorterDuff.Mode.Src; bar.BackgroundTintList = ColorStateList.ValueOf(tintColor.ToAndroid()); } } else { if (tintColor.IsDefault && _backgroundDrawable != null) { bar.SetBackground(_backgroundDrawable); } else if (!tintColor.IsDefault) { if (_backgroundDrawable == null) { _backgroundDrawable = bar.Background; } bar.SetBackgroundColor(tintColor.ToAndroid()); } } Color textColor = Element.BarTextColor; if (!textColor.IsDefault) { bar.SetTitleTextColor(textColor.ToAndroid().ToArgb()); } Color navIconColor = NavigationPage.GetIconColor(Current); if (!navIconColor.IsDefault && bar.NavigationIcon != null) { DrawableExtensions.SetColorFilter(bar.NavigationIcon, navIconColor, FilterMode.SrcAtop); } bar.Title = currentPage?.Title ?? string.Empty; if (_toolbar.NavigationIcon != null && !textColor.IsDefault) { var icon = _toolbar.NavigationIcon as DrawerArrowDrawable; if (icon != null) { icon.Color = textColor.ToAndroid().ToArgb(); } } UpdateTitleIcon(); UpdateTitleView(); }