Android 未在xamarin From中调用OnOptions ItemSelected
我是xamarin表单的新手。单击导航栏后退按钮时,我试图显示displayAlert。我已经试过了。问题是,当我单击弹出窗口未出现的按钮时,我在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
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);
}