如何在MAUI中向Android工具栏添加监听器?

3

我需要拦截Android后退箭头/汉堡图标的点击事件。 在Xamarin中,通过NavigationPageRenderer获取工具栏并将方法添加到toolbar.NavigationClick相对容易:

protected override void OnLayout(bool changed, int l, int t, int r, int b)
{
    base.OnLayout(changed, l, t, r, b);
    var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
    if (toolbar != null)
    {
        toolbar.NavigationClick += Toolbar_NavigationClick;
    }
}

现在我需要找到一种在MAUI中实现它的方法,因为NavigationPageRenderer已经被弃用了。我不想在全新的MAUI应用程序中使用过时的代码。

在MAUI.iOS中,有一个NavigationRenderer,设置方式基本与Xamarin.iOS相同,但我一直没有成功地弄清楚在Android中如何做到这一点。

我尝试过在PageHandler和NavigationViewHandler中获取工具栏,但工具栏始终为空:

// this is in my NavigationViewHandler
protected override View CreatePlatformView()
{
    var vw = base.CreatePlatformView();
    var toolbar1 = vw.FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.toolbar);
    var toolbar2 = vw.FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Layout.Toolbar);
    // both of thosw return null
    return viewGroup;
}

我认为我的主要挑战是我不理解如何使用这些处理程序,我们都知道 Microsoft 的文档写得很棕,所以现在是时候向比我聪明的所有人求助了。也许有一种更简单的方法来做到这一点?

1个回答

1
在我的Xamarin Forms应用程序中,我使用以下代码来访问工具栏:-
    public void SetToolbar()
    {
        // This was used previously when targeting older versions of Android
        //var toolBar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);

        var toolBar = FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.toolbar);

        SetSupportActionBar(toolBar);
    }

这样就可以重写OnOptionsItemSelected方法,根据返回箭头被按下来进行一些处理:

    public override bool OnOptionsItemSelected(IMenuItem item)
    {
        var result = base.OnOptionsItemSelected(item);

        PerformBack();

        return result;
    }

在 .NET MAUI 中,我已经能够使用以下方式定位工具栏:-
public void SetToolbar()
{
    var linearLayout = FindViewById<LinearLayout>(Resource.Id.navigationlayout_appbar);

    if (linearLayout != null)
    {
        var child1 = linearLayout.GetChildAt(0);

        if (child1 is MaterialToolbar child1AsMaterialToolbar)
        {
            SetSupportActionBar(child1AsMaterialToolbar);
        }
    }
}

这样就可以重写相同的OnOptionsItemSelected方法:

public override bool OnOptionsItemSelected(IMenuItem item)
{
    var result = base.OnOptionsItemSelected(item);

    PerformBack();

    base.OnBackPressed();

    return result;
}

你会注意到调用了base.OnBackPressed(),这是因为使用这种方法时,返回导航功能不可避免地会出现问题。
这远非理想的解决方案,原因如下:
  1. 使用过时的base.OnBackPressed方法来确保返回导航仍然有效
  2. 我还发现,在完全渲染要导航到的页面之后,需要确保调用SetToolbar方法,否则OnOptionsItemSelected将无法触发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接