示例#1
0
        private AndroidView CreateScrollViewContent()
        {
            View content = _ZoomScrollView.Content;

            if (content != null)
            {
                IVisualElementRenderer renderer = FormsPlatform.GetRenderer(content);

                if (renderer == null)
                {
                    renderer = FormsPlatform.CreateRendererWithContext(content, Context);
                    FormsPlatform.SetRenderer(content, renderer);
                }

                if (renderer.View.Parent != null)
                {
                    renderer.View.RemoveFromParent();
                }

                _contentTracker = new VisualElementTracker(renderer);
                _contentTracker.UpdateLayout();

                return(renderer.View);
            }

            return(null);
        }
示例#2
0
        public static IVisualElementRenderer GetOrCreateRenderer(this VisualElement bindable, Android.Content.Context context)
        {
            var renderer = XFPlatform.GetRenderer(bindable);

            if (renderer == null)
            {
                renderer = XFPlatform.CreateRendererWithContext(bindable, context);
                XFPlatform.SetRenderer(bindable, renderer);
            }
            return(renderer);
        }
示例#3
0
        public static IVisualElementRenderer GetOrCreateRenderer(this VisualElement bindable)
        {
            var renderer = XFPlatform.GetRenderer(bindable);

            if (renderer == null)
            {
                renderer = XFPlatform.CreateRendererWithContext(bindable, CrossCurrentActivity.Current.Activity);
                XFPlatform.SetRenderer(bindable, renderer);
            }
            return(renderer);
        }
        public static IVisualElementRenderer GetOrCreateRenderer(this VisualElement bindable)
        {
            var renderer = XFPlatform.GetRenderer(bindable);

            if (renderer == null)
            {
                renderer = XFPlatform.CreateRenderer(bindable);
                XFPlatform.SetRenderer(bindable, renderer);
            }
            return(renderer);
        }
        public static IVisualElementRenderer GetOrCreateRenderer(this VisualElement bindable, bool deneme = false)
        {
            var renderer = XFPlatform.GetRenderer(bindable);

            if (renderer == null || deneme)
            {
                if (renderer != null)
                {
                    renderer.Dispose();
                    //renderer = null;
                }
                renderer = XFPlatform.CreateRendererWithContext(bindable, CrossCurrentActivity.Current.Activity);
                XFPlatform.SetRenderer(bindable, renderer);
            }
            return(renderer);
        }
示例#6
0
        void UpdateHeader()
        {
            var header = (VisualElement)Controller.HeaderElement;

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

                if (header == null || Registrar.Registered.GetHandlerTypeForObject(header) != rendererType)
                {
                    if (_headerView != null)
                    {
                        _headerView.Child = null;
                    }
                    _headerRenderer.Dispose();
                    _headerRenderer = null;
                }
            }

            if (header == null)
            {
                return;
            }

            if (_headerRenderer != null)
            {
                _headerRenderer.SetElement(header);
            }
            else
            {
                _headerRenderer = Platform.CreateRenderer(header);
                if (_headerView != null)
                {
                    _headerView.Child = _headerRenderer;
                }
            }

            Platform.SetRenderer(header, _headerRenderer);
        }
        public static void ChangePage(this ExtendedTabbedPageRenderer renderer, FrameLayout pageContainer, Page page)
        {
            renderer.Context.HideKeyboard(renderer);
            if (page == null)
            {
                return;
            }

            if (Platform.GetRenderer(page) == null)
            {
                Platform.SetRenderer(page, Platform.CreateRendererWithContext(page, renderer.Context));
            }

            var pageContent = Platform.GetRenderer(page).View;

            pageContainer.AddView(pageContent);
            if (pageContainer.ChildCount > 1)
            {
                pageContainer.RemoveViewAt(0);
            }

            EnsureTabIndex(renderer);
        }
示例#8
0
        void ClearChildrenRenderers(VisualElement view)
        {
            if (view == null)
            {
                return;
            }

            foreach (Element logicalChild in ((IElementController)view).LogicalChildren)
            {
                var child = logicalChild as VisualElement;
                if (child != null)
                {
                    IVisualElementRenderer renderer = Platform.GetRenderer(child);
                    if (renderer == null)
                    {
                        continue;
                    }

                    if (renderer.View.Parent != _parent.View)
                    {
                        continue;
                    }

                    renderer.View.RemoveFromParent();

                    Platform.SetRenderer(child, null);
                    PushRenderer(renderer);
                }
            }

            var viewGroup = _parent.View as ViewGroup;

            if (viewGroup != null && viewGroup.ChildCount != 0)
            {
                viewGroup.RemoveAllViews();
            }
        }
        protected override AView GetCellCore(Cell item, AView convertView, ViewGroup parent, Context context)
        {
            Performance.Start();
            var cell = (ViewCell)item;

            var container = convertView as ViewCellContainer;

            if (container != null)
            {
                container.Update(cell);
                Performance.Stop();
                return(container);
            }

            BindableProperty unevenRows = null, rowHeight = null;

            if (ParentView is TableView)
            {
                unevenRows = TableView.HasUnevenRowsProperty;
                rowHeight  = TableView.RowHeightProperty;
            }
            else if (ParentView is ListView)
            {
                unevenRows = ListView.HasUnevenRowsProperty;
                rowHeight  = ListView.RowHeightProperty;
            }

            IVisualElementRenderer view = Platform.CreateRenderer(cell.View);

            Platform.SetRenderer(cell.View, view);
            cell.View.IsPlatformEnabled = true;
            var c = new ViewCellContainer(context, view, cell, ParentView, unevenRows, rowHeight);

            Performance.Stop();

            return(c);
        }
        public override AView OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            if (_shellContent != null)
            {
                _page = ((IShellContentController)_shellContent).GetOrCreateContent();
            }

            _root = inflater.Inflate(Resource.Layout.ShellContent, null).JavaCast <CoordinatorLayout>();

            _toolbar = _root.FindViewById <Toolbar>(Resource.Id.shellcontent_toolbar);

            _renderer = Platform.CreateRenderer(_page, Context);
            Platform.SetRenderer(_page, _renderer);

            _shellPageContainer = new ShellPageContainer(Context, _renderer);

            if (_root is ViewGroup vg)
            {
                vg.AddView(_shellPageContainer);
            }

            _toolbarTracker      = _shellContext.CreateTrackerForToolbar(_toolbar);
            _toolbarTracker.Page = _page;
            // this is probably not the most ideal way to do that
            _toolbarTracker.CanNavigateBack = _shellContent == null;

            _appearanceTracker = _shellContext.CreateToolbarAppearanceTracker();

            ((IShellController)_shellContext.Shell).AddAppearanceObserver(this, _page);

            if (_shellPageContainer.LayoutParameters is CoordinatorLayout.LayoutParams layoutParams)
            {
                layoutParams.Behavior = new AppBarLayout.ScrollingViewBehavior();
            }

            return(_root);
        }
示例#11
0
        void SetUpNewElement(IndicatorView newElement)
        {
            if (newElement == null)
            {
                IndicatorsView = null;
                return;
            }

            IndicatorsView = newElement;

            IndicatorsView.PropertyChanged += OnElementPropertyChanged;

            if (Tracker == null)
            {
                _visualElementTracker = new VisualElementTracker(this);
                //_visualElementPackager = new VisualElementPackager(this);
                //_visualElementPackager.Load();
            }

            this.EnsureId();

            UpdateBackgroundColor();

            if (IndicatorsView.IndicatorTemplate != null)
            {
                var control = IndicatorsView.IndicatorLayout.GetRenderer() ?? Platform.CreateRendererWithContext(IndicatorsView.IndicatorLayout, Context);
                Platform.SetRenderer(IndicatorsView.IndicatorLayout, control);
                AddView(control as AView);
            }
            else
            {
                UpdateItemsSource();
            }

            ElevationHelper.SetElevation(this, newElement);
        }
        void UpdateContent()
        {
            if (_renderer != null)
            {
                _renderer.View.RemoveFromParent();
                _renderer.Dispose();
                _renderer = null;
            }

            if (RefreshView.Content != null)
            {
                _renderer = Platform.CreateRenderer(RefreshView.Content, Context);

                Platform.SetRenderer(RefreshView.Content, _renderer);

                if (_renderer.View.Parent != null)
                {
                    _renderer.View.RemoveFromParent();
                }

                using (var layoutParams = new LayoutParams(LayoutParams.MatchParent, LayoutParams.MatchParent))
                    SwipeRefreshLayout.AddView(_renderer.View, layoutParams);
            }
        }
示例#13
0
        protected override void Dispose(bool disposing)
        {
            if (CheckFlagsForDisposed())
            {
                return;
            }

            _flags |= VisualElementRendererFlags.Disposed;

            if (disposing)
            {
                SetOnClickListener(null);
                SetOnTouchListener(null);

                EffectUtilities.UnregisterEffectControlProvider(this, Element);

                if (Element != null)
                {
                    Element.PropertyChanged -= _propertyChangeHandler;
                }

                if (Tracker != null)
                {
                    Tracker.Dispose();
                    Tracker = null;
                }

                if (_packager != null)
                {
                    _packager.Dispose();
                    _packager = null;
                }

                if (_gestureManager != null)
                {
                    _gestureManager.Dispose();
                    _gestureManager = null;
                }

                if (ManageNativeControlLifetime)
                {
                    while (ChildCount > 0)
                    {
                        AView child = GetChildAt(0);
                        child.RemoveFromParent();
                        child.Dispose();
                    }
                }

                if (Element != null)
                {
                    if (Platform.GetRenderer(Element) == this)
                    {
                        Platform.SetRenderer(Element, null);
                    }

                    Element = null;
                }
            }

            base.Dispose(disposing);
        }
        protected override void Dispose(bool disposing)
        {
            if ((_flags & VisualElementRendererFlags.Disposed) != 0)
            {
                return;
            }
            _flags |= VisualElementRendererFlags.Disposed;

            if (disposing)
            {
                if (Tracker != null)
                {
                    Tracker.Dispose();
                    Tracker = null;
                }

                if (_packager != null)
                {
                    _packager.Dispose();
                    _packager = null;
                }

                if (_scaleDetector != null && _scaleDetector.IsValueCreated)
                {
                    _scaleDetector.Value.Dispose();
                    _scaleDetector = null;
                }

                if (_gestureListener != null)
                {
                    _gestureListener.Dispose();
                    _gestureListener = null;
                }

                if (ManageNativeControlLifetime)
                {
                    int count = ChildCount;
                    for (var i = 0; i < count; i++)
                    {
                        AView child = GetChildAt(i);
                        child.Dispose();
                    }
                }

                RemoveAllViews();

                if (Element != null)
                {
                    Element.PropertyChanged -= _propertyChangeHandler;
                    UnsubscribeGestureRecognizers(Element);

                    if (Platform.GetRenderer(Element) == this)
                    {
                        Platform.SetRenderer(Element, null);
                    }

                    Element = null;
                }
            }

            base.Dispose(disposing);
        }
示例#15
0
            public void Update(ViewCell cell)
            {
                Performance.Start();

                var renderer        = GetChildAt(0) as IVisualElementRenderer;
                var viewHandlerType = Registrar.Registered.GetHandlerTypeForObject(cell.View) ?? typeof(Platform.DefaultRenderer);
                var reflectableType = renderer as System.Reflection.IReflectableType;
                var rendererType    = reflectableType != null?reflectableType.GetTypeInfo().AsType() : (renderer != null ? renderer.GetType() : typeof(System.Object));

                if (renderer != null && rendererType == viewHandlerType)
                {
                    Performance.Start("Reuse");
                    _viewCell = cell;

                    cell.View.DisableLayout = true;
                    foreach (VisualElement c in cell.View.Descendants())
                    {
                        c.DisableLayout = true;
                    }

                    Performance.Start("Reuse.SetElement");
                    renderer.SetElement(cell.View);
                    Performance.Stop("Reuse.SetElement");

                    Platform.SetRenderer(cell.View, _view);

                    cell.View.DisableLayout = false;
                    foreach (VisualElement c in cell.View.Descendants())
                    {
                        c.DisableLayout = false;
                    }

                    var viewAsLayout = cell.View as Layout;
                    if (viewAsLayout != null)
                    {
                        viewAsLayout.ForceLayout();
                    }

                    Invalidate();

                    Performance.Stop("Reuse");
                    Performance.Stop();
                    return;
                }

                RemoveView(_view.View);
                Platform.SetRenderer(_viewCell.View, null);
                _viewCell.View.IsPlatformEnabled = false;
                _view.View.Dispose();

                _viewCell = cell;
                _view     = Platform.CreateRenderer(_viewCell.View, Context);

                Platform.SetRenderer(_viewCell.View, _view);
                AddView(_view.View);

                UpdateIsEnabled();
                UpdateWatchForLongPress();

                Performance.Stop();
            }
示例#16
0
        Task <bool> SwitchContentAsync(Page view, bool animated, bool removed = false)
        {
            Context.HideKeyboard(this);

            IVisualElementRenderer rendererToAdd = Platform.GetRenderer(view);
            bool existing = rendererToAdd != null;

            if (!existing)
            {
                Platform.SetRenderer(view, rendererToAdd = Platform.CreateRenderer(view));
            }

            Page pageToRemove = _current;
            IVisualElementRenderer rendererToRemove  = pageToRemove == null ? null : Platform.GetRenderer(pageToRemove);
            PageContainer          containerToRemove = rendererToRemove == null ? null : (PageContainer)rendererToRemove.ViewGroup.Parent;
            PageContainer          containerToAdd    = (PageContainer)rendererToAdd.ViewGroup.Parent ?? new PageContainer(Context, rendererToAdd);

            containerToAdd.SetWindowBackground();

            _current = view;

            ((Platform)Element.Platform).NavAnimationInProgress = true;

            var tcs = new TaskCompletionSource <bool>();

            if (animated)
            {
                if (s_currentAnimation != null)
                {
                    s_currentAnimation.Cancel();
                }

                if (removed)
                {
                    // animate out
                    if (containerToAdd.Parent != this)
                    {
                        AddView(containerToAdd, Element.LogicalChildren.IndexOf(rendererToAdd.Element));
                    }
                    else
                    {
                        ((Page)rendererToAdd.Element).SendAppearing();
                    }
                    containerToAdd.Visibility = ViewStates.Visible;

                    if (containerToRemove != null)
                    {
                        Action <AndroidAnimation.Animator> done = a =>
                        {
                            containerToRemove.Visibility = ViewStates.Gone;
                            containerToRemove.Alpha      = 1;
                            containerToRemove.ScaleX     = 1;
                            containerToRemove.ScaleY     = 1;
                            RemoveView(containerToRemove);

                            tcs.TrySetResult(true);
                            ((Platform)Element.Platform).NavAnimationInProgress = false;

                            VisualElement removedElement = rendererToRemove.Element;
                            rendererToRemove.Dispose();
                            if (removedElement != null)
                            {
                                Platform.SetRenderer(removedElement, null);
                            }
                        };

                        // should always happen
                        s_currentAnimation = containerToRemove.Animate().Alpha(0).ScaleX(0.8f).ScaleY(0.8f).SetDuration(250).SetListener(new GenericAnimatorListener {
                            OnEnd = a =>
                            {
                                s_currentAnimation = null;
                                done(a);
                            },
                            OnCancel = done
                        });
                    }
                }
                else
                {
                    bool containerAlreadyAdded = containerToAdd.Parent == this;
                    // animate in
                    if (!containerAlreadyAdded)
                    {
                        AddView(containerToAdd);
                    }
                    else
                    {
                        ((Page)rendererToAdd.Element).SendAppearing();
                    }

                    if (existing)
                    {
                        Element.ForceLayout();
                    }

                    containerToAdd.Alpha      = 0;
                    containerToAdd.ScaleX     = containerToAdd.ScaleY = 0.8f;
                    containerToAdd.Visibility = ViewStates.Visible;
                    s_currentAnimation        = containerToAdd.Animate().Alpha(1).ScaleX(1).ScaleY(1).SetDuration(250).SetListener(new GenericAnimatorListener {
                        OnEnd = a =>
                        {
                            if (containerToRemove != null && containerToRemove.Handle != IntPtr.Zero)
                            {
                                containerToRemove.Visibility = ViewStates.Gone;
                                if (pageToRemove != null)
                                {
                                    pageToRemove.SendDisappearing();
                                }
                            }
                            s_currentAnimation = null;
                            tcs.TrySetResult(true);
                            ((Platform)Element.Platform).NavAnimationInProgress = false;
                        }
                    });
                }
            }
            else
            {
                // just do it fast
                if (containerToRemove != null)
                {
                    if (removed)
                    {
                        RemoveView(containerToRemove);
                    }
                    else
                    {
                        containerToRemove.Visibility = ViewStates.Gone;
                    }
                }

                if (containerToAdd.Parent != this)
                {
                    AddView(containerToAdd);
                }
                else
                {
                    ((Page)rendererToAdd.Element).SendAppearing();
                }

                if (containerToRemove != null && !removed)
                {
                    pageToRemove.SendDisappearing();
                }

                if (existing)
                {
                    Element.ForceLayout();
                }

                containerToAdd.Visibility = ViewStates.Visible;
                tcs.SetResult(true);
                ((Platform)Element.Platform).NavAnimationInProgress = false;
            }

            return(tcs.Task);
        }
示例#17
0
        protected virtual void AddChildView(VisualElement childView)
        {
            _pageContainer = null;

            Page page = childView as NavigationPage ?? (Page)(childView as TabbedPage);

            if (page == null)
            {
                // The thing we're adding is not a NavigationPage or TabbedPage, so we can just use the old AddChildView

                if (_currentFragment != null)
                {
                    if (!_parent.IsAttachedToRoot())
                    {
                        return;
                    }

                    // But first, if the previous occupant of this container was a fragment, we need to remove it properly
                    FragmentTransaction transaction = FragmentManager.BeginTransactionEx();
                    transaction.RemoveEx(_currentFragment);
                    transaction.SetTransitionEx((int)FragmentTransit.None);

                    if (IsAttachedToWindow)
                    {
                        ExecuteTransaction(transaction);
                    }
                    else
                    {
                        _transaction = transaction;
                    }

                    _currentFragment = null;
                }

                IVisualElementRenderer renderer = Platform.GetRenderer(childView);
                if (renderer == null)
                {
                    Platform.SetRenderer(childView, renderer = Platform.CreateRenderer(childView, Context));
                }

                if (renderer.View.Parent != this)
                {
                    if (renderer.View.Parent != null)
                    {
                        renderer.View.RemoveFromParent();
                    }
                    SetDefaultBackgroundColor(renderer);
                    AddView(renderer.View);
                    renderer.UpdateLayout();
                }
            }
            else
            {
                if (!_parent.IsAttachedToRoot())
                {
                    return;
                }

                // The renderers for NavigationPage and TabbedPage both host fragments, so they need to be wrapped in a
                // FragmentContainer in order to get isolated fragment management
                Fragment fragment = FragmentContainer.CreateInstance(page);

                var fc = fragment as FragmentContainer;

                fc?.SetOnCreateCallback(pc =>
                {
                    _pageContainer = pc;
                    UpdateFlowDirection();
                    SetDefaultBackgroundColor(pc.Child);
                });

                FragmentTransaction transaction = FragmentManager.BeginTransactionEx();

                if (_currentFragment != null)
                {
                    transaction.RemoveEx(_currentFragment);
                }

                transaction.AddEx(Id, fragment);
                transaction.SetTransitionEx((int)FragmentTransit.None);

                if (IsAttachedToWindow)
                {
                    ExecuteTransaction(transaction);
                }
                else
                {
                    _transaction = transaction;
                }

                _currentFragment = fragment;
            }
        }