在xamarin froms中没有调用OnOptionsItemSelected

时间:2018-06-04 08:40:39

标签: android android-studio xamarin xamarin.forms xamarin.android

我是xamarin表格的新手。我在点击 NavigationBar后退按钮时尝试显示displayAlert。我尝试过实施this article。问题是当我点击弹出窗口没有出现的按钮时,我在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中使用它

4 个答案:

答案 0 :(得分:1)

isaman kumara 于 2019-06-01 发表的评论如下:

<块引用>

当您将以下行添加到 MainActivity 时,问题将得到解决 OnCreate 方法(在 LoadApplication(new App()); 行之后)

Android.Support.V7.Widget.Toolbar 工具栏 = this.FindViewById(Resource.Id.toolbar); SetSupportActionBar(工具栏);

其中一个回复是这样说的:

<块引用>

这似乎不再起作用。 SetSupportActionBar 需要一个 AndroidX.AppCompat.Widget.Toolbar 类型的参数,它不起作用 使用 Android.Support.V7.Widget.Toolbar。

通过将它添加到 LoadApplication 行之后的 MainActivity 的 OnCreate 方法,我能够在 Xamarin Forms 4.8 中再次运行 OnOptionsItemSelected:

# -*- coding: UTF-8 -*-

很抱歉没有直接对之前的评论发表评论,但我没有足够的声望点来这样做。

答案 1 :(得分:0)

您可能尚未创建触发事件。 在要覆盖后退按钮的内容页面中,请尝试以下操作:

            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);
                }
            };

然后你会得到这个事件和一个弹出窗口,询问你是否真的,真的想回去。

答案 2 :(得分:0)

我也遇到了同样的问题,并找到了解决方案。问题是MainActivityFormsAppCompactActivity的子类,而不是原来的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/

答案 3 :(得分:0)

我知道这是一个老问题,但是您可以像这样通过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后退按钮。

希望这会有所帮助