I try to change the cursor color on a Xamarin Forms Entry. So far I followed the solution by this Forum Post:
https://forums.xamarin.com/discussion/138361/change-cursor-color-in-entry
Which is this code in a custom renderer:
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);
Unfortunately this doesn't work anymore on my Android Q Emulator / Device. I get this exception:
Java.Lang.NoSuchFieldError: no "I" field "mCursorDrawableRes" in class "Landroid/widget/TextView;"
Is there another way to do it?
Sample: https://1drv.ms/u/s!Ang3D30bKDOhqPATE80z8n3pUX9JxQ?e=L08oiB
If someone facing a crash while compiling the project with android SDK 10 (Q) then please do this way:
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);
}
Cheers!
When you use EntryRenderer, the Control is type of Entry:
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
Control.SetTextCursorDrawable(Resource.Drawable.my_cursor);
}
While when you use MaterialEntryRenderer, the Control is type of MaterialFormsTextInputLayout, so it won't work when you change the mCursorDrawableRes of MaterialFormsTextInputLayout, it even can't be found so you get the exception, the correct way is :
public class EntryRendererForAndroid : MaterialEntryRenderer
{
public EntryRendererForAndroid(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
Control.EditText.SetTextCursorDrawable(Resource.Drawable.my_cursor);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With