Xamarin.Forms Java .Lang.NullPointerException, когда ContentPage имеет прослушиватель событий SizeChanged - PullRequest
0 голосов
/ 05 мая 2020

Я получаю следующее сообщение об ошибке, когда пытаюсь перезаписать Xamarin.Forms ContentPage.Content.

Я просто получаю сообщение, если новый ContentPage имеет прослушиватель событий SizeChanged.

Java.Lang.NullPointerException
  Message=Attempt to read from field 'int android.view.ViewGroup$LayoutParams.width' on a null object reference

Код ContentPage, который я хочу загрузить

    public class ShowSizePage : ContentPage
    {
        readonly Label label;
        public ShowSizePage()
        {
            label = new Label
            {
                FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
                HorizontalOptions = LayoutOptions.Center,
                VerticalOptions = LayoutOptions.Center,
                Text = "initialized",
            };

            SizeChanged += OnPageSizeChanged;
            Content = label;
        }
        void OnPageSizeChanged (object sender, EventArgs args)
        {
            label.Text = String.Format("{0} \u00D7 {1}", Width, Height);
        }

    }

Код от вызывающего выше ContentPage

// Part of an other ContentPage
        void OnShowSizeClicked (object sender, EventArgs args)
        {
            ContentPage c = new ShowSizePage();

            Content = c.Content; // Exception is caused here
        }

Я не получаю исключение, если я вызываю ShowSizePage прямо со своего MainPage.

Что мне нужно изменить, чтобы избежать исключения?

Изменить минимальный воспроизводимый пример кода:

using System;
using Xamarin.Forms;

namespace NP_Exception
{
    public partial class App : Application
    {
        public App()
        {
            InitializeComponent();

            // Change this to false to see that ShowSizePage works properly if not loaded through MenuPage
            bool showMenu = true;

            if (showMenu)
                MainPage = new MenuPage(); // Throws exception
            else
                MainPage = new ShowSizePage(); // Works
        }
    }

    public class MenuPage : ContentPage
    {
        readonly StackLayout menu = new StackLayout();
        readonly ScrollView menuView = new ScrollView();
        public MenuPage ()
        {
            Button showSizeButton = new Button { Text = "Show Size" };
            showSizeButton.Clicked += OnShowSizeClicked;
            menu.Children.Add(showSizeButton);

            Button showLabelButton = new Button { Text = "Show Label" };
            showLabelButton.Clicked += OnShowLabelClicked;
            menu.Children.Add(showLabelButton);

            menuView.Content = menu;

            Content = menuView;
        }    
        void OnShowSizeClicked(object sender, EventArgs args)
        {
            ContentPage c = new ShowSizePage();

            Content = c.Content; // Exception is caused here
        }

        void OnShowLabelClicked(object sender, EventArgs args)
        {
            ContentPage c = new ShowLabelPage();

            Content = c.Content;
        }

        protected override bool OnBackButtonPressed()
        {
            Content = menuView;

            return true;
        }
    }
    public class ShowSizePage : ContentPage
    {
        readonly Label label;
        public ShowSizePage()
        {
            label = new Label
            {
                FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
                HorizontalOptions = LayoutOptions.Center,
                VerticalOptions = LayoutOptions.Center,
                Text = "initialized",
            };

            SizeChanged += OnPageSizeChanged;
            Content = label;
        }
        void OnPageSizeChanged(object sender, EventArgs args)
        {
            label.Text = String.Format("{0} \u00D7 {1}", Width, Height);
        }

    }
    public class ShowLabelPage : ContentPage {
        public ShowLabelPage ()
        {
            Content = new Label { Text = "Hello World! Press hardware back button for menu." };
        }
    }
}

Обновление: Исключение возникает в Xamarin.Forms v4.4.0.991265, но, похоже, исправлено в v4.6.0.726

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Я нашел решение, чтобы избавиться от исключения и получить желаемый результат.

Мне пришлось обернуть содержимое страницы в ContentView и привязать событие SizeChanged к ContentView

Пример рабочего кода :

    public class ShowSizePage : ContentPage
    {
        readonly Label label;
        public ShowSizePage()
        {
            label = new Label
            {
                FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label)),
                HorizontalOptions = LayoutOptions.Center,
                VerticalOptions = LayoutOptions.Center,
                Text = "initialized",
            };

            // Wrap Content in ContentView to avoid Exception
            ContentView view = new ContentView { Content = label };

            // Bind SizeChanged event to view
            view.SizeChanged += OnPageSizeChanged;

            // Set View as Content
            Content = view;
        }
        void OnPageSizeChanged(object sender, EventArgs args)
        {
            // Use Width & Height of the sender object
            View view = (View)sender;

            label.Text = String.Format("{0} \u00D7 {1}", view.Width, view.Height);
        }
    }
0 голосов
/ 11 мая 2020

Эта проблема исправлена ​​в последней версии Xamrin.forms v4.6.0.726. Любой, кто столкнется с этой проблемой в более ранней версии, может обновить ваш Xamarin.Forms, чтобы решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...