ToolbarItem图标停止工作

时间:2017-08-08 20:43:43

标签: android xamarin.forms android-resources

我的应用有一个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   type,System.String propertyName)[0x0000d] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ ResourceManager.cs:76   在Xamarin.Forms.Platform.Android.ResourceManager.IdFromTitle   (System.String标题,System.Type类型)[0x00007] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ ResourceManager.cs:70   在Xamarin.Forms.Platform.Android.ResourceManager.GetDrawable   (Android.Content.Res.Resources资源,System.String名称)[0x00000]   在   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ ResourceManager.cs:42   在   Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.UpdateMenu   ()[0x000f7] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ NavigationPageRenderer.cs:747   在   Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.ToolbarTrackerOnCollectionChanged   (System.Object sender,System.EventArgs eventArgs)[0x00000] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ NavigationPageRenderer.cs:715   在Xamarin.Forms.Internals.ToolbarTracker.EmitCollectionChanged()   [0x00008] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \内幕\ ToolbarTracker.cs:60   在Xamarin.Forms.Internals.ToolbarTracker.set_Target   (Xamarin.Forms.Page value)[0x00031] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \内幕\ 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.VisualElementRenderer 1 [TElement] .SetElement   (元素元素)[0x000f4] in   C:\ BuildAgent3 \工作\ 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] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ VisualElementRenderer.cs:137   在Xamarin.Forms.Platform.Android.Platform.CreateRenderer   (Xamarin.Forms.VisualElement元素)[0x0001f] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \ Platform.cs:289   在Xamarin.Forms.Platform.Android.AppCompat.Platform.AddChild   (Xamarin.Forms.Page页面,System.Boolean布局)[0x00015] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ Platform.cs:250   在Xamarin.Forms.Platform.Android.AppCompat.Platform.SetPage   (Xamarin.Forms.Page newRoot)[0x00089] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ Platform.cs:239   在   Xamarin.Forms.Platform.Android.FormsAppCompatActivity.InternalSetPage   (Xamarin.Forms.Page页面)[0x0001a] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ FormsAppCompatActivity.cs:370   在   Xamarin.Forms.Platform.Android.FormsAppCompatActivity.AppOnPropertyChanged   (System.Object sender,System.ComponentModel.PropertyChangedEventArgs   args)[0x00012] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Platform.Android \程序兼容性\ FormsAppCompatActivity.cs:321   在Xamarin.Forms.BindableObject.OnPropertyChanged(System.String   propertyName)[0x0000a] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \ BindableObject.cs:136   在Xamarin.Forms.Element.OnPropertyChanged(System.String   propertyName)[0x00000] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Element.cs:380   在Xamarin.Forms.Application.set_MainPage(Xamarin.Forms.Page值)   [0x0008b] in   C:\ BuildAgent3 \工作\ ca3766cfc22354a1 \ Xamarin.Forms.Core \ Application.cs:90   在Intertain.Mobile.Custom.CustomMvxFormsPagePresenter.TryShowPage [T]   (MvvmCross.Core.ViewModels.MvxViewModelRequest请求)[0x0005c] in   D:\ Visual Studio \ My   项目\ Intertain \手机\ Intertain.Mobile \ Intertain.Mobile \自定义\ 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>

尝试将图标值设置为&#34; Refresh.png&#34;,&#34; refresh.png&#34;,&#34;刷新&#34;和&#34;刷新&#34;,使用名为Refresh.png的图像或者drawable文件夹中的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>

页面加载得很好,没有问题,我看到文字&#34;刷新&#34;当然没有图标。

因此,我确信问题在于它没有找到图像,但我无法找到如何让它找到它。

图像设置为AndroidResource,但我确实尝试过EmbeddedResource和None ...

我在这里做错了什么?

编辑:史蒂夫激励我尝试使用转换器绑定资源,所以我掀起了这个:

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上留下文字而不是图标,因为有一个糟糕的用户界面比有一个破坏的用户界面更好,并且将它粉碎到xamarin表格仍然很糟糕,我需要继续寿命。

如果你有任何想法,我可以再试一次游戏,但是我通过黑客攻击这个。

2 个答案:

答案 0 :(得分:0)

您是否尝试过从代码中添加项目?

var searchToolbarItem = new ToolbarItem { Icon = AssetNames.SearchIcon };
ToolbarItems.Add(searchToolbarItem);
searchToolbarItem.SetBinding(MenuItem.CommandProperty, nameof(BookPageViewModel.OpenAppointmentsSearchCommand));

AssetNames.SearchIcon的位置:

public const string SearchIcon = "ic_search_white.png";

我还注意到你将Xamarin.Forms更新为1.2?该套餐版本从2014年7月开始。

如果是这种情况,请尝试相同的: Xamarin.Forms 2.3.4.247

同时删除bin / obj文件夹并重建项目!

答案 1 :(得分:0)

我就是这样做的:

查看

<ContentPage.ToolbarItems>
    <ToolbarItem Icon="{Binding AddIcon}" Command="{Binding AddCommand}" />
</ContentPage.ToolbarItems>

查看模型

public ImageSource AddIcon => "ic_add.png";

该图标位于Resources \ drawable \ ic_add.png中,并具有AndroidResource的构建操作。

确保视图模型中的文件名和名称均为小写。