提问人:Thunderlight 提问时间:7/7/2018 最后编辑:Super JadeThunderlight 更新时间:1/6/2019 访问量:859
Xamarin Forms - Droid:自定义选取器对话框导致异常:对象引用未设置为对象的实例
Xamarin Forms - Droid: Custom Picker's Dialog causing Exception: Object reference not set to an instance of an object
问:
背景描述
我正在使用 Visual Studio for Mac 开发跨平台移动应用程序。 该项目的 Xamarin.Forms 版本为 3.1.0.583944(这是最新的可用版本)。对于 Android,所有入口组件都有一个线条,而不是一个框的线 (_____),因此(并且作为要求)创建了一个自定义渲染来更改组件的外观。
在项目文件夹中,创建了 CustomPicker.cs:
using System;
using Xamarin.Forms;
namespace Project
{
public class CustomPicker : Picker
{
public Color BorderColor { get; set; } = Color.Black;
}
}
在 Project.Droid 文件夹中,创建了 CustomPickerRenderer.cs:
using System;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.Views;
using Project;
using Project.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(CustomPicker), typeof(CustomPickerRenderer))]
namespace Project.Droid
{
public class CustomPickerRenderer : PickerRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
{
base.OnElementChanged(e);
if (Control != null)
{
var customPicker = (CustomPicker)e.NewElement;
GradientDrawable gd = new GradientDrawable();
gd.SetColor(Android.Graphics.Color.Transparent);
gd.SetStroke(2, customPicker.BorderColor.ToAndroid());
this.Control.SetBackground(gd);
this.Control.SetTextColor(e.NewElement.TextColor.ToAndroid());
this.Control.SetHintTextColor(Android.Graphics.Color.Gray);
}
}
}
}
xaml 文件仅包含 CustomPicker 元素:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:signature="clr-namespace:SignaturePad.Forms;assembly=SignaturePad.Forms" xmlns:res="clr-Project" x:Class="Poject.View" xmlns:local="clr-Project;assembly=Project">
<ContentPage.Content>
<local:CustomPicker x:Name="action_picker" TextColor="Black" Title="Seleccione la acción" BorderColor="#3D7C00" IsEnabled="false" ItemsSource="{Binding Actions}" ItemDisplayBinding="{Binding text}" SelectedIndexChanged="OnActionChange" SelectedItem="{Binding SelectedAction}" />
</ContentPage.Content>
</ContentPage>
问题
在测试自定义选取器时,我得到了所需的结果;选取器使用框状边框(而不是下划线)和一些其他颜色内容正确呈现。仅当测试了“所需”功能时,该组件才按预期工作(单击组件,等待弹出包含选项的对话框,单击选项,然后单击确定按钮)。当由于任何原因中断对话时,会出现此问题。例如,我单击组件,当弹出选项对话框时,我单击后退按钮 - 然后对话框显示在另一个视图中,当点击选项或按钮时,会引发异常。(另一种情况发生在对话框打开时,我从顶部滑动屏幕以打开配置和通知菜单,然后返回到应用程序)。异常 StackTrace 如下所示:
未处理的异常: System.NullReferenceException:对象引用未设置为对象的实例。 在 Xamarin.Forms.Platform.Android.PickerRenderer+<>c__DisplayClass12_0.b__0 (System.Object s、Android.Content.DialogClickEventArgs a)[0x00000] 在 D:\a\1\s\Xamarin.Forms.Platform.Android\Renderers\PickerRenderer.cs:135
at Android.Content.IDialogInterfaceOnClickListenerImplementor.OnClick
(Android.Content.IDialogInterface 对话框,System.Int32 其中) [0x0000a] 在 /Users/builder/data/lanes/5809/a7829590/source/monodroid/external/xamarin-android/src/Mono.Android/obj/Release/android-27/mcw/Android.Content.IDialogInterface.cs:250
at Android.Content.IDialogInterfaceOnClickListenerInvoker.n_OnClick_Landroid_content_DialogInterface_I
(System.IntPtr jnienv、System.IntPtr native__this、System.IntPtr native_dialog, System.Int32 其中) [0x00010] 在 /Users/builder/data/lanes/5809/a7829590/source/monodroid/external/xamarin-android/src/Mono.Android/obj/Release/android-27/mcw/Android.Content.IDialogInterface.cs:201
at (wrapper dynamic-method) System.Object.b72d5cd8-e4b0-403b-a87c-7a28c7960847(intptr,intptr,intptr,int)
尝试过的内容
在网上搜索,我找到了许多可能的解决方案,但不幸的是,没有一个对我有用:
- 更新 Xamarin.Forms
- 将 AppCompat 添加到程序集
- 向 OnElementChanged 函数添加 try - catch。
- 其他可能的解决方案我什至不记得了,也找不到它们的链接(因为我打开了大量链接)。
问题
- 如何处理此异常?
- 自定义选取器渲染器实现是否可行而不会发生此崩溃,或者我是否会被迫使用原始组件?
- 有没有办法访问错误堆栈 (Xamarin.Forms.Platform.Android.PickerRenderer+<>c__DisplayClass12_0.) 中描述的 OnClick 事件?
在此问题上的任何帮助将不胜感激。提前感谢所有愿意花时间阅读这篇长文并尝试提供帮助的人。
答: 暂无答案
评论
protected override void OnStart() { Global.AppInBackground = false; }
protected override void OnSleep() { Global.AppInBackground = true; }
protected override void OnResume() { Global.AppInBackground = false; }