Android Studio 在Xamarin中未调用OnOptionsItemSelected,表单

7uzetpgm  于 2023-01-14  发布在  Android
关注(0)|答案(4)|浏览(152)

我是Xamarin.Forms的新手。我尝试在单击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里面用。

dxxyhpgq

dxxyhpgq1#

isaman kumara在2019-06-01的评论中说:
将以下行添加到MainActivity OnCreate方法(LoadApplication(new App())之后)后,此问题将得到修复;行)
工具栏工具栏= this.FindViewById<Android.Support.V7.Widget.Toolbar>(资源标识工具栏);设置支持操作栏(工具栏);
其中一个答复是这样说的:
SetSupportActionBar需要一个AndroidX.AppCompat.Widget.Toolbar类型的参数,但它不适用于Android.Support.V7.Widget. Toolbar。
我可以通过在LoadApplication行之后将以下代码添加到MainActivity的OnCreate方法中,使OnOptionsItemSelected在Xamarin Forms 4.8中再次工作:

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

抱歉没有直接评论前面的评论,但我没有足够的声誉点这样做。

ippsafx7

ippsafx72#

我也遇到了同样的问题,并找到了解决方案。问题是MainActivityFormsAppCompactActivity的子类,而不是旧的FormsApplicationActivity,后者是MainActivity的前一个父类。因此,假设新FormsAppCompactActivity上存在bug
将以下行添加到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/

5cnsuln7

5cnsuln73#

我知道这是一个老问题,但是您可以通过NavigationRenderer跟踪OnPopViewAsync事件,如下所示:

[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后退按钮。
希望这能帮上忙

fafcakar

fafcakar4#

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

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

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

相关问题