当子页面包裹在 NavigationPage 中时,为什么 Xamarin Forms tabbedpage 抛出未处理的异常?

Why Xamarin Forms tabbedpage throws unhandled exception when the child page is wrapped inside NavigationPage?

我有一个遗留的 Xamarin 表单应用程序,我正在尝试向其中添加一个选项卡式页面作为根页面。这就是我的标签页 xaml 的样子-

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:ChildPage1="clr-namespace:sampleApp;assembly=sampleAssembly">
        <NavigationPage Title="Items" IconImageSource="icon_items_tab.png">
            <x:Arguments>
                <ChildPage1:ItemListPage  BindingContext="{Binding ItemListTabVM}" />
            </x:Arguments>
        </NavigationPage>
        <ContentPage Title="Messages" IconImageSource="icon_messages_tab.png" />
        <ContentPage Title="Search" IconImageSource="icon_search_tab.png" />
    </TabbedPage>

当我 运行 应用程序时,我收到以下未处理的异常 -

Android.Views.InflateException: Binary XML file line #1 in com.sample.xamarinapp:layout/toolbar: Binary XML file line #1 in com.sample.xamarinapp:layout/toolbar: Error inflating class <unknown>

以下是我从线程中提取的内部异常详细信息-

System.Diagnostics.Debugger.Mono_UnhandledException_internal()
 in System.Diagnostics.Debugger.Mono_UnhandledException_internal
 in System.Diagnostics.Debugger.Mono_UnhandledException at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.Diagnostics/Debugger.cs:125,4
 in Android.Runtime.DynamicMethodNameCounter.104
  in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:157,13
 in Java.Interop.JniEnvironment.InstanceMethods.CallObjectMethod
 in Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualObjectMethod
  in Android.Views.LayoutInflater.Inflate at /Users/builder/azdo/_work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-29/mcw/Android.Views.LayoutInflater.cs:661,5
 in Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.SetupToolbar at D:\a\s\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:789,5
 in Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.OnElementChanged at D:\a\s\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:347,6
 in Xamarin.Forms.Platform.Android.VisualElementRenderer<Xamarin.Forms.NavigationPage>.SetElement at D:\a\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:241,4
 in Xamarin.Forms.Platform.Android.VisualElementRenderer<Xamarin.Forms.NavigationPage>.Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement at D:\a\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:131,4
 in Xamarin.Forms.Platform.Android.Platform.CreateRenderer at D:\a\s\Xamarin.Forms.Platform.Android\Platform.cs:404,4
 in Xamarin.Forms.Platform.Android.AppCompat.FragmentContainer.OnCreateView at D:\a\s\Xamarin.Forms.Platform.Android\AppCompat\FragmentContainer.cs:57,5
 in AndroidX.Fragment.App.Fragment.n_OnCreateView_Landroid_view_LayoutInflater_Landroid_view_ViewGroup_Landroid_os_Bundle_ at D:\a\s\generated\androidx.fragment.fragment\obj\Release\monoandroid9.0\generated\src\AndroidX.Fragment.App.Fragment.cs:1977,4
  in Android.Runtime.DynamicMethodNameCounter.104
 in Java.Interop.NativeMethods.java_interop_jnienv_call_nonvirtual_void_method_a
 in Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod
 in Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeNonvirtualVoidMethod
 in Android.Views.View.Measure at /Users/builder/azdo/_work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-29/mcw/Android.Views.View.cs:16637,5
 in Xamarin.Forms.Platform.Android.AppCompat.TabbedPageRenderer.OnLayout at D:\a\s\Xamarin.Forms.Platform.Android\AppCompat\TabbedPageRenderer.cs:398,5
in Xamarin.Forms.Platform.Android.FormsViewGroup.n_OnLayout_ZIIII at D:\a\s\Xamarin.Forms.Platform.Android.FormsViewGroup\obj\Release\generated\src\Xamarin.Forms.Platform.Android.FormsViewGroup.cs:206,4
 in Android.Runtime.DynamicMethodNameCounter.40
in Java.Interop.NativeMethods.java_interop_jnienv_call_nonvirtual_void_method_a
 in Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod
in Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualVoidMethod
 in Xamarin.Forms.Platform.Android.FormsViewGroup.MeasureAndLayout at D:\a\s\Xamarin.Forms.Platform.Android.FormsViewGroup\obj\Release\generated\src\Xamarin.Forms.Platform.Android.FormsViewGroup.cs:189,5
 in Xamarin.Forms.Platform.Android.VisualElementTracker.UpdateLayout at D:\a\s\Xamarin.Forms.Platform.Android\VisualElementTracker.cs:111,5
in Xamarin.Forms.Platform.Android.VisualElementRenderer<Xamarin.Forms.TabbedPage>.UpdateLayout at D:\a\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:139,4
in Xamarin.Forms.Platform.Android.AppCompat.Platform.Xamarin.Forms.Platform.Android.IPlatformLayout.OnLayout at D:\a\s\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:235,4
 in Xamarin.Forms.Platform.Android.PlatformRenderer.OnLayout at D:\a\s\Xamarin.Forms.Platform.Android\PlatformRenderer.cs:78,4
 in Android.Views.ViewGroup.n_OnLayout_ZIIII at /Users/builder/azdo/_work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-29/mcw/Android.Views.ViewGroup.cs:3612,4
in Android.Runtime.DynamicMethodNameCounter.34

如果我删除 NavigationPage 包装器并将 ItemList 子页面放置为内容页面,应用程序将不会出现任何问题。为什么当子页面包裹在导航页面中时会抛出异常?在此先感谢您的帮助。 我正在使用 VS 2019,XF 5.0.0.2244

首先需要在TabbedPage中添加页面的引用,如:

xmlns:local="clr-namespace:TabbedPageWithNavigationPage;assembly=TabbedPageWithNavigationPage"

然后在NavigationPage wrapper中使用它的引用,例如:

<NavigationPage Title="Schedule" IconImageSource="schedule.png">
    <x:Arguments>
        <local:SchedulePage />
    </x:Arguments>
</NavigationPage>

如果您需要更多信息,请查看有关如何使用 NavigationPage 包装器的官方文档:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/tabbed-page

好的,我花了一些时间终于解决了这个问题。这是我所做的- 在我在问题中分享的内部错误信息中,提到了“Xamarin.Forms.Platform.Android.PlatformRenderer.OnLayout”。因此,我使用 TabbedPageRenderer 创建了一个自定义渲染器,并创建了对 'OnLayout()' 的覆盖。当我 运行 代码时,我在 base.OnLayout(更改、左、上、右、下)处得到了相同的异常,但这次有更多信息和堆栈跟踪。 堆栈跟踪显示实际错误 - java.lang.UnsupportedOperationException: Failed to resolve attribute at index 37: TypedValue{t=0x2/d=0x7f030007 a=6} at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:781) at android.view.View.<init>(View.java:5522) 因此,我搜索了这个特定的异常,这个 post 给了我一些想法。 我在Resource/Layout下加了一个Toolbar.xml。我删除了我们通常在 Toolbar.xml 中找到的以下主题。 android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:popupTheme="@style/ThemeOverlay.AppCompat.Light" 之后,我的应用程序开始工作。标签显示导航页面没有任何问题。

顺便说一下,我使用了 here 中的 Toolbar.xml 内容。