Android 未在xamarin From中调用OnOptions ItemSelected

Android 未在xamarin From中调用OnOptions ItemSelected,android,android-studio,xamarin,xamarin.forms,xamarin.android,Android,Android Studio,Xamarin,Xamarin.forms,Xamarin.android,我是xamarin表单的新手。单击导航栏后退按钮时,我试图显示displayAlert。我已经试过了。问题是,当我单击弹出窗口未出现的按钮时,我在onOptions ItemSelected方法上放置了一个调试器,以查看它是否被调用,它是否没有。这是我的主要活动 protected override void OnCreate(Bundle bundle) { TabLayoutResource = Resource.Layout.Tab

我是xamarin表单的新手。单击导航栏后退按钮时,我试图显示displayAlert。我已经试过了。问题是,当我单击弹出窗口未出现的按钮时,我在onOptions ItemSelected方法上放置了一个调试器,以查看它是否被调用,它是否没有。这是我的主要活动

        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);
            }
        }
protectedoverride void OnCreate(捆绑包)
{ 
TabLayoutResource=Resource.Layout.Tabbar;
ToolbarResource=Resource.Layout.Toolbar;
base.OnCreate(bundle);
全局::Xamarin.Forms.Forms.Init(这个,bundle);
全局::Xamarin.formsmap.Init(这个,bundle);
加载应用程序(新应用程序());
Android.Support.V7.Widget.Toolbar-Toolbar=this.findviewbyd(Resource.Id.Toolbar);
设置支持操作栏(工具栏);
}
公共覆盖bool OnOptionsItemSelected(IMenuItem)
{//在此处放置了一个调试器
//检查当前项目id是否等于后退按钮id
如果(item.ItemId==16908332)
{
//检索当前xamarin表单页面实例
var currentpage=Xamarin.Forms.Application.Current.MainPage.Navigation.NavigationStack.LastOrDefault()作为NavBackButtonContentPage;
//检查页面是否已订阅自定义后退按钮事件
如果(currentpage?.CustomBackButtonAction!=null)
{
//调用自定义后退按钮操作
currentpage?.CustomBackButtonAction.Invoke();
//并禁用默认的后退按钮操作
返回false;
}
//如果未订阅,则继续执行默认的后退按钮操作
返回基本选项。OnOptionsItemSelected(项目);
}
其他的
{
//由于不是单击“上一步”按钮,因此将事件传递给基础
返回基本选项。OnOptionsItemSelected(项目);
}
}

我在MasterDetailPage中使用它

您可能还没有创建触发事件。 在要覆盖“后退”按钮的contentpage中,请尝试以下操作:

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

然后,您将看到事件和一个弹出窗口,询问您是否真的真的想回去。

我也遇到了同样的问题,并找到了解决方案。问题是
MainActivity
是从
FormsAppCompactActivity
进行子分类的,而不是原来的
FormsApplicationActivity
,后者是
MainActivity
的父类。因此,假设新的
FormsAppCompactActivity

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

Android.Support.V7.Widget.Toolbar
=this.findviewbyd


我知道这是一个老问题,但您可以通过
导航呈现程序
跟踪
OnPopViewAsync
事件,如下所示:

[程序集:ExportRenderer(typeof(NavigationPage)、typeof(CustomNavigationRenderer))]
名称空间YourApp.Droid
{
公共类CustomNavigationRenderer:NavigationPageRenderer
{
公共CustomNavigationRenderer(上下文):基础(上下文)
{
}
受保护的覆盖异步任务OnPopViewAsync(第页,bool动画)
{
//在这里编写代码
}
}
}
使用此代码,您可以在Android中的同一位置捕获两个事件,按下硬件后退按钮和导航栏后退按钮

希望这能有所帮助。2019-06-01年的评论如下:

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

Android.Support.V7.Widget.Toolbar工具栏 =this.findviewbyd(Resource.Id.toolbar); 设置支持操作栏(工具栏)

其中一份答复说:


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

通过在LoadApplication行之后将其添加到MainActivity的OnCreate方法中,我能够使OnOptions ItemSelected在Xamarin Forms 4.8中再次工作:

if (FindViewById(Resource.Id.toolbar) is AndroidX.AppCompat.Widget.Toolbar toolbar)
{
    SetSupportActionBar(toolbar);
}

很抱歉没有直接对前面的评论发表评论,但我没有足够的信誉点来这么做。

为什么不使用弹出窗口在pcl中进行评论?可以使用OnDisapperaing()在pcl上进行评论,问题是,当它请求响应时,它已经进入最后一页,有一个onbackpressed事件,您应该在ContentPages中签出,这是物理按钮,请阅读我的问题。我想把它放在导航栏的背面按钮你检查过了吗?我已经实现了这个事件,但它仍然没有被触发。这似乎对我来说硬件后退按钮不起作用,所以在活动中按下后退按钮是我唯一可以开始工作的方法。不过,这对于“软后退”按钮非常有效。这似乎不再有效。SetSupportActionBar需要类型为AndroidX.AppCompat.Widget.Toolbar的参数,但它不能与Android.Support.V7.Widget.Toolbar一起使用。另外,如果我使用AndroidX工具栏而不是V7工具栏,它仍然无法工作。@ChristophMett您能解决这个问题吗?我通过禁用“后退”按钮并将自定义控件放入
导航页。TitleView
来“解决”它。在这里,你可以看到我是如何做到这一点的:免责声明:用户界面在安卓系统上只经过了良好的测试(因此是本机的),对于iOS来说,其他的利润率等都是非常必要的。
if (FindViewById(Resource.Id.toolbar) is AndroidX.AppCompat.Widget.Toolbar toolbar)
{
    SetSupportActionBar(toolbar);
}