1

tl;dr:带有 ViewRenderer< Entry , TextInputLayout> 的 CustomRenderer 有效,带有 ViewRenderer< Editor , TextInputLayout> 的 CustomRenderer 无效。

我通过 CustomRenderer 创建了一个带有浮动标签的 EditText: Android 设计示例

使用 Entry 类渲染

个人电脑:

public class MyFloatEntry : Entry { /*...*/ }

安卓项目:

[assembly: ExportRenderer(typeof(MyFloatEntry), typeof(MyFloatEntry_Droid))]
namespace MyProject.Droid.Renderer
{
    public class MyFloatEntry_Droid : ViewRenderer<MyFloatEntry, TextInputLayout>, ITextWatcher, TextView.IOnEditorActionListener
    {
        public MyFloatEntry_Droid(Context context) : base(context)
        {
            //[...]
        }
    }
}

    protected override void OnElementChanged(ElementChangedEventArgs<MyFloatEntry> e)
    {
        base.OnElementChanged(e);
        //[...]
    }
}

这工作得很好,我使用 android 平台提供的 TextInputLayout 获得了带有浮动提示的精彩条目。

现在我也想为编辑器这样做。

使用 Entry 类渲染

个人电脑:

public class MyFloatEditor : Editor{ /*...*/ }

安卓项目:

[assembly: ExportRenderer(typeof(MyFloatEditor), typeof(MyFloatEditor_Droid))]
namespace MyProject.Droid.Renderer
{
    public class MyFloatEditor_Droid : ViewRenderer<MyFloatEditor, TextInputLayout>, ITextWatcher, TextView.IOnEditorActionListener
    {
        public MyFloatEditor_Droid(Context context) : base(context) //throws "class not found"
        {
            //[...]
        }
    }
}

    protected override void OnElementChanged(ElementChangedEventArgs<MyFloatEditor> e)
    {
        base.OnElementChanged(e);
        //[...]
    }
}

但这会在 ctor 中引发空引用异常。我用两个 ViewRenderers(appcompat、nonappcompat)、一个基本的 ctor、ctor 和上下文签名对其进行了测试,但是,它总是抛出如下所示的相同错误:

应用程序中的 JNI 检测到错误:调用 JNI CallObjectMethodA 时出现未决异常 android.runtime.JavaProxyThrowable:System.Reflection.TargetInvocationException:调用目标已引发异常。---> Java.Lang.ClassNotFoundException:在路径上找不到类“md541a10de1a99b1e04dd7b48feb368a279.MyFloatEditor_Droid”:DexPathList [[zip 文件“/data/app/MyProject.Android-1/base.apk”],nativeLibraryDirectories=[/ data/app/MyProject.Android-1/lib/arm/system/fake-libs,/data/app/MyProject.Android-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/ lib]] 在 Java.Interop.JniEnvironment+Types.FindClass(System.String 类名)[0x00114] 在 <438784097c4b4b56a7da6ca9301bc3c6>:0

在 Java.Interop.JniType..ctor(System.String 类名) [0x00006] in <438784097c4b4b56a7da6ca9301bc3c6>:0 在 Java.Interop.JniPeerMembers+JniInstanceMethods..ctor (System.Type declaringType)[0x00064] in <438784097c401c56a7da6ca3c3c3c3:06ca在 Java.Interop.JniPeerMembers+JniInstanceMethods.GetConstructorsForType (System.Type declaringType)[0x0002c] in <438784097c4b4b56a7da6ca9301bc3c6>:0 在 Java.Interop.JniPeerMembers+JniInstanceMethods.StartCreateInstance (System.String constructorSignature, System.Type declaringType, Java.Interop. JniArgumentValue* 参数)[0x00032] in <438784097c4b4b56a7da6ca9301bc3c6>:0 在 Xamarin.Forms.Platform.Android.FormsViewGroup..ctor(Android.Content.Context p0) [0x00046] 在 D:\agent_work\1\s\Xamarin.Forms .Platform.Android。FormsViewGroup\obj\Release\generated\src\Xamarin.Forms.Platform.Android.FormsViewGroup.cs:89 在 Xamarin.Forms.Platform.Android.VisualElementRenderer1[TElement]..ctor (Android.Content.Context context)[0x00012] in D:\agent\_work\1\s\Xamarin.Forms.Platform.Android\VisualElementRenderer.cs:30 at Xamarin.Forms.Platform.Android.ViewRenderer2[TView, TNativeView]..ctor (Android.Content.Context 上下文)[0x00000] 在 D:\agent_work\1\s\Xamarin.Forms.Platform.Android\ViewRenderer.cs:25 在 Xamarin.Forms.Platform。 D:\agent_work\1\s\Xamarin.Forms.Platform.Android\AppCompat\ViewRenderer.cs 中的 Android.AppCompat.ViewRenderer`2[TView, TControl]..ctor (Android.Content.Context 上下文)[0x00000]: 8 在 MyProject.Droid.Renderer.MyFloatEditor_Droid..ctor(Xamarin.Forms.Platform.Android.FormsAppCompatActivity 上下文) [0x00000] 在 D:\Workspaces\HelloWorld\HelloWorld.MyProject\MyProject\MyProject\MyProject.Android\Renderer\MyFloatEditor_Droid .cs:41 at(wrapper managed-to-native) System.Reflection.MonoCMethod:InternalInvoke(System.Reflection.MonoCMethod, object, object[], System.Exception&) at System.Reflection.MonoCMethod.InternalInvoke(System.Object obj , 系统。Object[] 参数)[0x00002] in <657aa8fea4454dc898a9e5f379c58734>:0

4

0 回答 0