这里是针对基于 Xamarin 的 Jonh's 答案 的解决方案。
public static void SetHandlesColor(EditText editText, Color color)
{
try
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
{
var size = SpToPx(22, editText.Context);
var corner = size / 2f;
var inset = SpToPx(10, editText.Context);
var drLeft = new GradientDrawable(GradientDrawable.Orientation.BottomTop, new[] { (int)color, color });
drLeft.SetSize(size, size);
drLeft.SetCornerRadii(new[] { corner, corner, 0f, 0f, corner, corner, corner, corner });
editText.TextSelectHandleLeft = new InsetDrawable(drLeft, inset, 0, inset, inset);
var drRight = new GradientDrawable(GradientDrawable.Orientation.BottomTop, new[] { (int)color, color });
drRight.SetSize(size, size);
drRight.SetCornerRadii(new[] { 0f, 0f, corner, corner, corner, corner, corner, corner });
editText.TextSelectHandleRight = new InsetDrawable(drRight, inset, 0, inset, inset);
var drMiddle = new GradientDrawable(GradientDrawable.Orientation.BottomTop, new[] { (int)color, color });
drMiddle.SetSize(size, size);
drMiddle.SetCornerRadii(new[] { 0f, 0f, corner, corner, corner, corner, corner, corner });
var mInset = (int)(System.Math.Sqrt(2f) * corner - corner);
var insetDrawable = new InsetDrawable(drMiddle, mInset, mInset, mInset, mInset);
var rotateDrawable = new RotateDrawable();
rotateDrawable.Drawable = insetDrawable;
rotateDrawable.ToDegrees = 45f;
rotateDrawable.SetLevel(10000);
editText.TextSelectHandle = rotateDrawable;
return;
}
var editorField = Class.FromType(typeof(TextView)).GetDeclaredField("mEditor");
if (!editorField.Accessible)
editorField.Accessible = true;
var editor = editorField.Get(editText);
var editorClass = editor.Class;
string[] handleNames = { "mSelectHandleLeft", "mSelectHandleRight", "mSelectHandleCenter" };
string[] resNames = { "mTextSelectHandleLeftRes", "mTextSelectHandleRightRes", "mTextSelectHandleRes" };
for (int i = 0; i < handleNames.Length; i++)
{
var handleField = editorClass.GetDeclaredField(handleNames[i]);
if (!handleField.Accessible)
{
handleField.Accessible = true;
}
Drawable handleDrawable = (Drawable)handleField.Get(editor);
if (handleDrawable == null)
{
var resField = Class.FromType(typeof(TextView)).GetDeclaredField(resNames[i]);
if (!resField.Accessible)
{
resField.Accessible = true;
}
int resId = resField.GetInt(editText);
handleDrawable = ContextCompat.GetDrawable(editText.Context, resId);
}
if (handleDrawable != null)
{
Drawable drawable = handleDrawable.Mutate();
drawable.SetColorFilter(color, PorterDuff.Mode.SrcIn);
handleField.Set(editor, drawable);
}
}
}
catch (ReflectiveOperationException) { }
catch (Exception ex)
{
Crashes.TrackError(ex);
}
}
public static int SpToPx(float sp, Context context)
{
return (int)TypedValue.ApplyDimension(ComplexUnitType.Sp, sp, context.Resources.DisplayMetrics);
}