Xamarin.forms 表单条目更改光标颜色

Xamarin.forms 表单条目更改光标颜色,xamarin.forms,Xamarin.forms,我尝试更改Xamarin表单条目上的光标颜色。到目前为止,我通过以下论坛帖子遵循了解决方案: 这是自定义渲染器中的以下代码: IntPtr IntPtrtextViewClass = JNIEnv.FindClass(typeof(TextView)); IntPtr mCursorDrawableResProperty = JNIEnv.GetFieldID(IntPtrtextViewClass, "mCursorDrawableRes", "I"); // my_cursor is t

我尝试更改Xamarin表单条目上的光标颜色。到目前为止,我通过以下论坛帖子遵循了解决方案:

这是自定义渲染器中的以下代码:

IntPtr IntPtrtextViewClass = JNIEnv.FindClass(typeof(TextView));
IntPtr mCursorDrawableResProperty = JNIEnv.GetFieldID(IntPtrtextViewClass, "mCursorDrawableRes", "I");

// my_cursor is the xml file name which we defined above
JNIEnv.SetField(Control.Handle, mCursorDrawableResProperty, Resource.Drawable.my_cursor);
不幸的是,这在我的Android Q模拟器/设备上不再起作用。我得到一个例外:

Java.Lang.NoSuchFieldError: no "I" field "mCursorDrawableRes" in class "Landroid/widget/TextView;"
还有别的办法吗


示例:

使用
EntryRenderer
时,控件的类型为
条目

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

    base.OnElementChanged(e);
    Control.SetTextCursorDrawable(Resource.Drawable.my_cursor);

}

如果有人在使用android SDK 10(Q)编译项目时遇到崩溃,请这样做:

    if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
    {
        Control.SetTextCursorDrawable(0); //This API Intrduced in android 10
    }
    else
    {
        IntPtr IntPtrtextViewClass = JNIEnv.FindClass(typeof(TextView));
        IntPtr mCursorDrawableResProperty = JNIEnv.GetFieldID(IntPtrtextViewClass, "mCursorDrawableRes", "I");
        JNIEnv.SetField(Control.Handle, mCursorDrawableResProperty, 0);
    }

干杯

在你提到的帖子中,回答问题的人也分享了一个示例应用程序。我在我这边运行了它,光标使用我在colors.xml文件中设置的颜色正确显示。你试过了吗?是的,我也试过了。但它不起作用。我假设Xamarin.Forms.visual.Material中有什么东西覆盖了它。正如我所说,我下载了示例并按原样运行了它。成功了。然后我更新了Xamarin.Forms版本并再次运行了该项目,它运行起来没有问题。我在颜色文件中做了一些更改,它们反映在内置应用程序中。你的问题可能会出现在其他地方。。。你的消息来源?当您按原样运行示例时,是否仍会得到错误?和你发布的一样?据我所知,这个样本没有使用Xamarin.Forms.Visual.Material,这会影响颜色。因此,我在接受的答案中使用了使用反射的解决方案。使用前面提到的示例,我在项目中安装了Visual.Material,代码仍然按照需要运行。也许你可以详细说明你的问题,让我们知道重现你的问题的确切步骤:)看起来很棒!但是当我在示例中使用它时,我得到了以下异常:Java.Lang.NoSuchMethodError:“no non static method”Landroid/support/design/widget/textinputettext;.setTextCursorDrawable(I)V“'我做错什么了吗?@NPadrutt您可以检查我的示例。顺便说一句,如果您使用MaterialEntryRenderer,该条目将成为MaterialFormsTextInputLayout,它可能与Xamarin.forms中的本机条目不同,它是经过设计的。感谢您提供的示例。不幸的是,这在我的计算机上崩溃,并出现相同的错误。。我会在另一台电脑上检查一下,看看我的安装是否有问题。啊,问题是,我在安卓9模拟器上进行了测试。此API仅适用于Android 10及以上版本。因此,我必须添加一个版本检查:@NPadrutt如何以及在何处为共享项目添加版本检查?如何在Xamarin.Forms的共享项目中执行相同的操作?@sham您可以编写自定义条目渲染器,并在那里编写此渲染器。可以找到代码示例
    if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
    {
        Control.SetTextCursorDrawable(0); //This API Intrduced in android 10
    }
    else
    {
        IntPtr IntPtrtextViewClass = JNIEnv.FindClass(typeof(TextView));
        IntPtr mCursorDrawableResProperty = JNIEnv.GetFieldID(IntPtrtextViewClass, "mCursorDrawableRes", "I");
        JNIEnv.SetField(Control.Handle, mCursorDrawableResProperty, 0);
    }