Xamarin表单-Droid:自定义选择器对话框导致异常:对象引用未设置为对象的实例

时间:2018-07-06 23:00:22

标签: c# xamarin xamarin.forms xamarin.android nullreferenceexception

背景说明

我正在使用Visual Studio for Mac开发跨平台移动应用程序。该项目的Xamarin.Forms版本是3.1.0.583944(这是最新版本)。对于Android,所有输入组件都有一行而不是(____________)的框,因此(并根据要求)创建了一个自定义渲染器来更改组件的外观。

在Project文件夹中创建了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)

尝试了什么

在网络上搜索,我找到了许多可能的解决方案,但不幸的是,没有一个对我有用:

问题

  1. 如何处理此异常?
  2. 是否可以在没有此崩溃的情况下实现自定义选择器渲染器实现,还是会被迫使用原始组件?
  3. 是否可以访问错误堆栈(Xamarin.Forms.Platform.Android.PickerRenderer + <> c__DisplayClass12_0。)中描述的OnClick事件?

在此问题上的任何帮助都将受到赞赏。在此先感谢所有愿意花时间阅读这篇文章并尝试提供帮助的人。

0 个答案:

没有答案