当子页面包裹在 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 内容。
我有一个遗留的 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 内容。