• Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题


    Xamarin.forms3.0中Naxam.BottomTabbedPage v0.2.0.2遇到的问题

    Naxam.BottomTabbedPage V0.2.0.3中已修复

    Naxam.BottomTabbedPage的使用:

    http://www.cnblogs.com/devin_zhou/p/8278794.html

    在将Xamarin.Forms更新到3.0后,BottomTappedPage在被释放的时候会引起崩溃。

    崩溃在哪里引起的呢:

    通过调试源码发现BottomTabbedRenderer中Dispose被调用了两次,第一次正常Dispose掉过后,Element已经被释放了,第二次Dispose的时候Element便引起了NullPointerException。

    现在来看源码中Dispose方法:

    protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    Element.ChildAdded -= PagesChanged;
                    Element.ChildRemoved -= PagesChanged;
                    Element.ChildrenReordered -= PagesChanged;
    
                    if (rootLayout != null)
                    {
                        //TODO Cleanup
                        RemoveAllViews();
                        foreach (Page pageToRemove in Element.Children)
                        {
                            IVisualElementRenderer pageRenderer = Platform.GetRenderer(pageToRemove);
    
                            if (pageRenderer != null)
                            {
                                pageRenderer.ViewGroup.RemoveFromParent();
                                pageRenderer.Dispose();
                            }
                        }
    
                        if (bottomNav != null)
                        {
                            bottomNav.SetOnNavigationItemSelectedListener(null);
                            bottomNav.Dispose();
                            bottomNav = null;
                        }
                        rootLayout.Dispose();
                        rootLayout = null;
                    }
                }
    
                base.Dispose(disposing);
            }
    View Code

     不修改源码的解决方案:

    首先新建MyTabbedPage一个类继承BottomTabbedPage

    public class MyTabbedPage : Naxam.Controls.Forms.BottomTabbedPage
        {
            public MyTabbedPage ()
            {
            }
        }
    View Code

    然后新建MyTabbedPageRenderer继承BottomTabbedRenderer,并重新Dispose方法,在Dispose方法中对Element进行判断

    [assembly: ExportRenderer(typeof(MyTabbedPage), typeof(MyTabbedPageRenderer))]
    namespace Demo.Droid.Renderers
    {
        /// <summary>
        /// 重写BottomTabbedRenderer 解决Xamarin.Forms3.0中,Dispose方法被调用两次,引起崩溃问题
        /// </summary>
        public class MyTabbedPageRenderer: BottomTabbedRenderer
        {
    
            protected override void Dispose(bool disposing)
            {
                if (disposing && Element != null)
                {
                    base.Dispose(disposing);
                }
    
            }
        }
    }
    View Code
  • 相关阅读:
    某公司面试的SQL题目
    列存储索引
    JList动态添加元素
    Java中堆、栈、常量池等概念解析
    JButton大小设置问题?
    JAVA中定时器的使用
    线性表和链表的区别
    JTable表头显示问题以及如何让某行选中
    JPanel如何设置背景图片
    关于Scanner调用nextInt()异常try后不能二次输入问题
  • 原文地址:https://www.cnblogs.com/devin_zhou/p/9028214.html
Copyright © 2020-2023  润新知