Пример #1
0
        void UpdateTitleView()
        {
            AToolbar bar = _toolbar;

            if (bar == null)
            {
                return;
            }

            Page currentPage = Element.CurrentPage;

            if (currentPage == null)
            {
                return;
            }

            VisualElement titleView = NavigationPage.GetTitleView(currentPage);

            if (_titleViewRenderer != null)
            {
                var reflectableType = _titleViewRenderer as System.Reflection.IReflectableType;
                var rendererType    = reflectableType != null?reflectableType.GetTypeInfo().AsType() : _titleViewRenderer.GetType();

                if (titleView == null || Registrar.Registered.GetHandlerTypeForObject(titleView) != rendererType)
                {
                    if (_titleView != null)
                    {
                        _titleView.Child = null;
                    }
                    Platform.ClearRenderer(_titleViewRenderer.View);
                    _titleViewRenderer.Dispose();
                    _titleViewRenderer = null;
                }
            }

            if (titleView == null)
            {
                return;
            }

            if (_titleViewRenderer != null)
            {
                _titleViewRenderer.SetElement(titleView);
            }
            else
            {
                _titleViewRenderer = Platform.CreateRenderer(titleView, Context);

                if (_titleView == null)
                {
                    _titleView = new Container(Context);
                    bar.AddView(_titleView);
                }

                _titleView.Child = _titleViewRenderer;
            }

            Platform.SetRenderer(titleView, _titleViewRenderer);
        }
Пример #2
0
        void ResetToolbar()
        {
            AToolbar oldToolbar = _toolbar;

            _toolbar.SetNavigationOnClickListener(null);
            _toolbar.RemoveFromParent();

            _toolbar.RemoveView(_titleView);
            _titleView = null;

            if (_titleViewRenderer != null)
            {
                Platform.ClearRenderer(_titleViewRenderer.View);
                _titleViewRenderer.Dispose();
                _titleViewRenderer = null;
            }

            _toolbar.RemoveView(_titleIconView);
            _titleIconView = null;

            _imageSource = null;

            _toolbar = null;

            SetupToolbar();

            // if the old toolbar had padding from transluscentflags, set it to the new toolbar
            if (oldToolbar.PaddingTop != 0)
            {
                _toolbar.SetPadding(0, oldToolbar.PaddingTop, 0, 0);
            }

            RegisterToolbar();
            UpdateToolbar();
            UpdateMenu();

            // Preserve old values that can't be replicated by calling methods above
            if (_toolbar != null)
            {
                _toolbar.Subtitle = oldToolbar.Subtitle;
            }
        }
Пример #3
0
        protected override void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;

            if (disposing)
            {
                Device.Info.PropertyChanged -= 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 MasterDetailPage (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);
        }