【发布时间】:2017-08-08 20:43:43
【问题描述】:
我的应用定义了一个 ToolbarItem,其图标如下:
<ContentPage.ToolbarItems>
<ToolbarItem Name="Refresh" Order="Primary" Text="Refresh" Icon="Refresh.png" Priority="0" Command="{Binding RefreshCommand}" />
</ContentPage.ToolbarItems>
图像位于 Resources/drawable/Refresh.png 中,此 XAML 在 Xamarin Forms 2.3.4.247 中运行良好。
突然之间,在同一版本 2.3.4.247 上,同样的 XAML 因空引用异常而失败:
{System.NullReferenceException:对象引用未设置为 对象的实例。在 Xamarin.Forms.Platform.Android.ResourceManager.GetId (System.Type 类型,System.String propertyName) [0x0000d] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\ResourceManager.cs:76 在 Xamarin.Forms.Platform.Android.ResourceManager.IdFromTitle (System.String 标题,System.Type 类型)[0x00007] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\ResourceManager.cs:70 在 Xamarin.Forms.Platform.Android.ResourceManager.GetDrawable (Android.Content.Res.Resources 资源,System.String 名称)[0x00000] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\ResourceManager.cs:42 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.UpdateMenu () [0x000f7] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:747 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.ToolbarTrackerOnCollectionChanged (System.Object 发送者,System.EventArgs eventArgs)[0x00000] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:715 在 Xamarin.Forms.Internals.ToolbarTracker.EmitCollectionChanged () [0x00008] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Internals\ToolbarTracker.cs:60 在 Xamarin.Forms.Internals.ToolbarTracker.set_Target (Xamarin.Forms.Page 值)[0x00031] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Internals\ToolbarTracker.cs:37 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.OnElementChanged (Xamarin.Forms.Platform.Android.ElementChangedEventArgs
1[TElement] e) [0x000f2] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\NavigationPageRenderer.cs:258 at Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement].SetElement (TElement 元素)[0x000f4] 中 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:196 在 Xamarin.Forms.Platform.Android.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.Android.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement 元素)[0x00027] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:137 在 Xamarin.Forms.Platform.Android.Platform.CreateRenderer (Xamarin.Forms.VisualElement 元素)[0x0001f] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\Platform.cs:289 在 Xamarin.Forms.Platform.Android.AppCompat.Platform.AddChild (Xamarin.Forms.Page 页面,System.Boolean 布局)[0x00015] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:250 在 Xamarin.Forms.Platform.Android.AppCompat.Platform.SetPage (Xamarin.Forms.Page newRoot) [0x00089] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\Platform.cs:239 在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity.InternalSetPage (Xamarin.Forms.Page 页面)[0x0001a] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\FormsAppCompatActivity.cs:370 在 Xamarin.Forms.Platform.Android.FormsAppCompatActivity.AppOnPropertyChanged (System.Object 发送者,System.ComponentModel.PropertyChangedEventArgs args) [0x00012] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\FormsAppCompatActivity.cs:321 在 Xamarin.Forms.BindableObject.OnPropertyChanged (System.String propertyName) [0x0000a] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\BindableObject.cs:136 在 Xamarin.Forms.Element.OnPropertyChanged (System.String propertyName) [0x00000] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Element.cs:380 在 Xamarin.Forms.Application.set_MainPage (Xamarin.Forms.Page 值) [0x0008b] 在 C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Application.cs:90 在 Intertain.Mobile.Custom.CustomMvxFormsPagePresenter.TryShowPage[T] (MvvmCross.Core.ViewModels.MvxViewModelRequest 请求)[0x0005c] 在 D:\Visual Studio\我的 Projects\Intertain\Mobile\Intertain.Mobile\Intertain.Mobile\Custom\CustomMvxFormsPagePresenter.cs:76 }
研究问题时,我发现我应该使用小写的资源名称,我试图修复它,但无论我做什么,我仍然得到同样的错误。
我尝试将 XAML 更改为 OnPlatform:
<ContentPage.ToolbarItems>
<ToolbarItem Name="Refresh" Order="Primary" Text="Refresh" Priority="0" Command="{Binding RefreshCommand}">
<ToolbarItem.Icon>
<OnPlatform x:TypeArguments="FileImageSource" Android="refresh.png" WinPhone="refresh.png" />
</ToolbarItem.Icon>
</ToolbarItem>
</ContentPage.ToolbarItems>
尝试将 Icon 值设为“Refresh.png”、“refresh.png”、“refresh”和“Refresh”,在可绘制文件夹中使用名为 Refresh.png 或 refresh.png 的图像给我同样的结果错误。
如果我在 android 上将 Icon 属性设置为空白:
<ContentPage.ToolbarItems>
<ToolbarItem Name="Refresh" Order="Primary" Text="Refresh" Priority="0" Command="{Binding RefreshCommand}">
<ToolbarItem.Icon>
<OnPlatform x:TypeArguments="FileImageSource" Android="" WinPhone="refresh.png" />
</ToolbarItem.Icon>
</ToolbarItem>
</ContentPage.ToolbarItems>
页面加载正常,没有问题,我看到文本“刷新”,当然没有图标。
所以我确信问题在于它没有找到图像,但我终其一生都无法弄清楚如何让它找到它。
图像设置为 AndroidResource,但我确实尝试了 EmbeddedResource 和 None...
我到底做错了什么?
编辑:Steve 启发我尝试使用转换器绑定到资源,所以我做了这个:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var source= ImageSource.FromFile(parameter.ToString());
return source;
}
我传入一个虚拟绑定和参数来创建源:
<ToolbarItem Name="Refresh" Order="Primary" Text="Refresh" Icon="{Binding IsLoading, Converter={StaticResource IconSourceConverter}, ConverterParameter=refresh.png}" Priority="0" Command="{Binding RefreshCommand}" />
它被实例化了(我从转换器返回的源值没有得到空引用错误)
但是在我退货后,我得到了同样愚蠢的错误。
我正式放弃了,我只想在 android 上留下文字而不是图标,因为有一个糟糕的 UI 比有一个坏掉的 UI 更好,并且把它归结为 xamarin 形式仍然很糟糕,我需要继续生活。
如果你有任何想法,我可以再试一次,但我已经通过黑客攻击了。
【问题讨论】:
-
尝试更新表单。上一个版本已经是 2.3.4.247 你有点落后了:-)
-
哎呀,我看错了包。事实证明我在 2.3.4.247,并且正在运行的版本也在同一版本上。我正在更新帖子以说明这一点,对于我的困惑感到抱歉
-
您能否提供一个示例项目,我们/将看看我们是否可以重新创建并可能解决问题?它必须很简单,因为它适用于我的项目
-
我会看看我是否可以在一个空白项目中重新创建它,但我不抱希望,因为就像我提到的出于某种原因,同一个项目的旧版本可以正常工作。我认为这是 android appcompat 的 nuget 包,但降级以匹配工作版本也不起作用。但是,是的,这个周末我会挖掘更多,如果我能得到一个样品,我会回来报告,谢谢!
标签: android xamarin.forms android-resources