OnOptionsItemSelected не вызывается в xamarin froms - PullRequest
0 голосов
/ 04 июня 2018

Я новичок в формах ксамарина.я пытаюсь показать displayAlert при нажатии NavigationBar кнопку назад .Я попытался реализовать эту статью .Проблема в том, что когда я нажимаю на кнопку, всплывающее окно не появляется, я помещаю отладчик в метод OnOptionsItemSelected, чтобы увидеть, вызывается ли он или нет, но это не так.Это мой MainActivity.cs

        protected override void OnCreate(Bundle bundle)
        { 
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            global::Xamarin.FormsMaps.Init(this, bundle);
            LoadApplication(new App());

            Android.Support.V7.Widget.Toolbar toolbar = this.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(toolbar);

        }


        public override bool OnOptionsItemSelected(IMenuItem item)
        {//Placed a debugger here
            // check if the current item id is equals to the back button id
            if (item.ItemId == 16908332)
            {
                // retrieve the current xamarin forms page instance
                var currentpage = Xamarin.Forms.Application.Current.MainPage.Navigation.NavigationStack.LastOrDefault() as NavBackButtonContentPage;

                // check if the page has subscribed to the custom back button event
                if (currentpage?.CustomBackButtonAction != null)
                {
                    // invoke the Custom back button action
                    currentpage?.CustomBackButtonAction.Invoke();
                    // and disable the default back button action
                    return false;
                }

                // if its not subscribed then go ahead with the default back button action
                return base.OnOptionsItemSelected(item);
            }
            else
            {
                // since its not the back button click, pass the event to the base
                return base.OnOptionsItemSelected(item);
            }
        }

Я использую его внутри MasterDetailPage

Ответы [ 3 ]

0 голосов
/ 01 июня 2019

У меня тоже была такая же проблема и я нашел решение.Проблема в том, что MainActivity был подклассом от FormsAppCompactActivity вместо старого FormsApplicationActivity, который был предыдущим родительским классом для MainActivity.Итак, допустим ошибку на новом FormsAppCompactActivity

Эта проблема будет исправлена, когда вы добавите следующие строки в метод MainActivity OnCreate (после строки LoadApplication(new App());)

Android.Support.V7.Widget.Toolbar toolbar 
                = this.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(toolbar);

Ссылочный URL инить следующим образом https://forums.xamarin.com/discussion/comment/218663

https://theconfuzedsourcecode.wordpress.com/2017/03/02/formsappcompatactivity-is-not-calling-onoptionsitemselected-xamarin-android/

0 голосов
/ 26 июля 2019

Я знаю, что это старый вопрос, но вы можете отследить событие OnPopViewAsync через NavigationRenderer следующим образом:

[assembly: ExportRenderer(typeof(NavigationPage), typeof(CustomNavigationRenderer))]
namespace YourApp.Droid
{
    public class CustomNavigationRenderer : NavigationPageRenderer
    {
        public CustomNavigationRenderer(Context context) : base(context)
        {
        }

        protected override async Task<bool> OnPopViewAsync(Page page, bool animated)
        {
            // Write your code here
        }
    }
}

Используя этот код, вы можете захватить оба события в одном и том же месте.в Android нажата аппаратная кнопка возврата и кнопка возврата NavigationBar.

Надеюсь, это поможет

0 голосов
/ 04 июня 2018

Возможно, вы не создали событие для запуска.На странице содержимого, которую вы хотите переопределить кнопкой «Назад», попробуйте следующее:

            this.CustomBackButtonAction = async () =>
            {
                var result = await this.DisplayAlert(null,
                    "Hey wait now! are you sure " +
                    "you want to go back?",
                    "Yes go back", "Nope");

                if (result)
                {
                    await Navigation.PopAsync(true);
                }
            };

Затем вы получите событие и всплывающее окно с вопросом, действительно ли вы действительно хотите вернуться.

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