«System.Reflection.TargetInvocationException» в Xamarin Android - PullRequest
0 голосов
/ 28 апреля 2018

Здравствуйте. Я пытаюсь создать приложение с использованием форм Xamarin, которые содержат фрейм с изображением и записью внутри него.

Ниже мой XAML

    <?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:local="clr-namespace:SampleLoginRenderer" 
    x:Class="SampleLoginRenderer.SampleLoginRendererPage"
    BackgroundColor="Blue">

    <ContentPage.Content>
    <Grid Grid.Row="3" Padding="0,10,0,0">
        <local:MyFrame BackgroundColor="Red" OutlineColor="White" HasShadow="false" Padding="20,5,5,5" VerticalOptions="Center">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>

                <Image Source="nav_user.png" HeightRequest="20" WidthRequest="20" HorizontalOptions="Start" />

                <local:MyEntry Placeholder="UserName / PhoneNo" 
                       x:Name="EntryUserName" 
                       BackgroundColor="White" 
                       PlaceholderColor="White" 
                       Grid.Column="1" 
                       HorizontalOptions="FillAndExpand" 
                       TextColor="White"  
                       FontSize="15"    
                       HeightRequest="40" />
          </Grid>
    </local:MyFrame>
  </Grid>
        </ContentPage.Content>
</ContentPage>

А затем у меня есть пользовательские средства визуализации для фрейма и записи в проектах iOS и Android.

Frame Renderers в Android Project:

Во-первых, я создал класс в проекте PCL,

    using System;
    using Xamarin.Forms;

    namespace SampleLoginRenderer
    {
        public class MyFrame : Frame
        {

        }
    }

И создал файл XML, (см. Ниже)

    <?xml version="1.0" encoding="UTF-8"?>

  <shape xmlns:android="http://schemas.android.com/apk/res/android" 
         android:shape="rectangle">
    <stroke android:width="2.3dp" android:color="#ffffff"/>

    <solid android:color="#00000000"/>
    <corners android:radius="5dp" />
  </shape>

Класс FrameRenderer в Android:

using Xamarin.Forms;
using System;
using Xamarin.Forms.Platform.Android;
using SampleLoginRenderer;
using SampleLoginRenderer.Android;
using Android.Content;
using Android.Graphics.Drawables;
using Android.Text;
using Android.Content.Res;
using SampleLoginRenderer.Droid;
using Android.Graphics;

[assembly: ExportRenderer(typeof(MyFrame), typeof(MyFrameRenderer))]
namespace SampleLoginRenderer.Droid
{
    public class MyFrameRenderer : FrameRenderer
    {
        public MyFrameRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
        {
            base.OnElementChanged(e);


                this.SetBackgroundResource(Resource.Drawable.blue_resct);

        }
    }
}

Frame Renderers в iOS:

Создать класс FrameRenderer

using Xamarin.Forms;
using System;
using SampleLoginRenderer;
using SampleLoginRenderer.iOS;
using Xamarin.Forms.Platform.iOS;
using CoreGraphics;
using UIKit;

[assembly: ExportRenderer(typeof(MyFrame), typeof(MyFrameRenderer))]

namespace SampleLoginRenderer.iOS
{
    public class MyFrameRenderer : FrameRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
        {
            base.OnElementChanged(e);
            this.Layer.CornerRadius = 18;
            this.Layer.Bounds.Inset(1, 1);
            Layer.BorderColor = UIColor.White.CGColor;
            Layer.BorderWidth = 2;
            Layer.BackgroundColor = Color.Transparent.ToCGColor();
        }
    }
}

Точно так же я создал Entry Renderers в проектах Android и iOS:

В PCL,

using System;
using Xamarin.Forms;

namespace SampleLoginRenderer
{
    public class MyEntry : Entry
    {

    }
}

Xamarin Android Entry Renderer:

using Xamarin.Forms;
using System;
using Xamarin.Forms.Platform.Android;
using SampleLoginRenderer;
using SampleLoginRenderer.Android;
using Android.Content;
using Android.Graphics.Drawables;
using Android.Text;
using Android.Content.Res;

[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace SampleLoginRenderer.Android
{
    public class MyEntryRenderer : EntryRenderer
    {
        public MyEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                GradientDrawable gd = new GradientDrawable();
                gd.SetColor(global::Android.Graphics.Color.Transparent);
                #pragma warning disable CS0618 // Type or member is obsolete
                this.Control.SetBackgroundDrawable(gd);
                #pragma warning restore CS0618 // Type or member is obsolete
                this.Control.SetRawInputType(InputTypes.TextFlagNoSuggestions);
                Control.SetHintTextColor(ColorStateList.ValueOf(global::Android.Graphics.Color.White));
            }
        }
    }
}

Xamarin iOS Entry Renderer:

using SampleLoginRenderer;
using SampleLoginRenderer.iOS;
using Xamarin.Forms;
using System;
using Xamarin.Forms.Platform.iOS;
using UIKit;

[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace SampleLoginRenderer.iOS
{
    public class MyEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {

                Control.BorderStyle = UITextBorderStyle.None;
                Control.Layer.CornerRadius = 10;
                Control.TextColor = UIColor.White;

            }
        }
    }
}

Я запускаю приложение на iOS, и оно дает мне желаемый результат, которого я хочу (см. Ниже)

Result iOS

Но когда я запускаю одно и то же приложение на Android, я получаю следующее исключение, и приложение вылетает

Android Exception

Я не могу понять, почему это происходит на Android, тогда как на iOS все работает нормально.

Любые обходные пути или предложения будут высоко оценены.

Заранее спасибо

...