Xamarin.forms 使用Xamarin Forms Visual在Android上更改光标

Xamarin.forms 使用Xamarin Forms Visual在Android上更改光标,xamarin.forms,Xamarin.forms,我有一个Xamarin Forms Android应用程序,它的材质设计是可视化的。这似乎将光标颜色覆盖为黑色。现在我想创造一个黑暗的主题。在IOS上,光标颜色随字体颜色变为白色而变化。但在安卓系统上,它仍然是黑色的,几乎看不见。有没有一种方法可以替代设置为光标颜色的颜色 基于此论坛讨论,我尝试了以下效果: 光标可拖动: <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shap

我有一个Xamarin Forms Android应用程序,它的材质设计是可视化的。这似乎将光标颜色覆盖为黑色。现在我想创造一个黑暗的主题。在IOS上,光标颜色随字体颜色变为白色而变化。但在安卓系统上,它仍然是黑色的,几乎看不见。有没有一种方法可以替代设置为光标颜色的颜色

基于此论坛讨论,我尝试了以下效果:

光标可拖动:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

  <solid android:color="@color/colorAccent"></solid>
  <size android:width="2dp" />

</shape>

最后,我为条目创建了一个自定义渲染器

[assembly: ExportRenderer(typeof(Entry), typeof(CustomEntryRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
namespace MoneyFox.Droid.Renderer
{
    public class CustomEntryRenderer : MaterialEntryRenderer
    {
        public CustomEntryRenderer(Context context) : base(context) {
        }

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

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

            JNIEnv.SetField(Control.EditText.Handle, mCursorDrawableResProperty, Resource.Drawable.CustomCursor);

            // try set cursor pointer color
            try
            {
                TextView textViewTemplate = new TextView(Control.EditText.Context);

                var field = textViewTemplate.Class.GetDeclaredField("mEditor");
                field.Accessible = true;
                var editor = field.Get(Control.EditText);

                String[]
                    fieldsNames = { "mTextSelectHandleLeftRes", "mTextSelectHandleRightRes", "mTextSelectHandleRes" },
                    drawablesNames = { "mSelectHandleLeft", "mSelectHandleRight", "mSelectHandleCenter" };

                for (Int32 index = 0; index < fieldsNames.Length && index < drawablesNames.Length; index++)
                {
                    String
                        fieldName = fieldsNames[index],
                        drawableName = drawablesNames[index];

                    field = textViewTemplate.Class.GetDeclaredField(fieldName);
                    field.Accessible = true;
                    Int32 handle = field.GetInt(Control.EditText);

                    Drawable handleDrawable = Resources.GetDrawable(handle, null);

                    handleDrawable.SetColorFilter(Color.Accent.ToAndroid(), PorterDuff.Mode.SrcIn);

                    field = editor.Class.GetDeclaredField(drawableName);
                    field.Accessible = true;
                    field.Set(editor, handleDrawable);
                }
            } 
            catch (Exception ex)
            {
                LogManager.GetCurrentClassLogger().Error(ex);
            }
        }
    }
}
[程序集:ExportRenderer(typeof(Entry)、typeof(CustomEntryRenderer)、new[]{typeof(VisualMarker.MaterialVisual)}]
命名空间MoneyFox.Droid.Renderer
{
公共类CustomEntryRenderer:MaterialEntryRenderer
{
公共CustomEntryRenderer(上下文):基本(上下文){
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e){
基础。一个要素发生变化(e);
//设置光标颜色
IntPtr IntPtrtextViewClass=JNIEnv.FindClass(typeof(TextView));
IntPtr mCursorDrawableResProperty=JNIEnv.GetFieldID(IntPtrtextViewClass,“mcursordrawables”,“I”);
SetField(Control.EditText.Handle、mCursorDrawableResProperty、Resource.Drawable.CustomCursor);
//尝试设置光标指针颜色
尝试
{
TextView textViewTemplate=新的TextView(Control.EditText.Context);
var field=textViewTemplate.Class.GetDeclaredField(“mEditor”);
field.Accessible=true;
var editor=field.Get(Control.EditText);
字符串[]
fieldsNames={“MTEXTSELECTHANDLEFTRES”、“MTEXTSELECTHANDLERIGHTERS”、“mTextSelectHandleRes”},
drawablesNames={“mSelectHandleLeft”、“mSelectHandleRight”、“mSelectHandleCenter”};
对于(Int32 index=0;index

在那里,我可以调用Control.EditText.Handle,它可以访问本机控件。不幸的是,这是无法访问的效果。

我结束了一个自定义渲染器的条目

[assembly: ExportRenderer(typeof(Entry), typeof(CustomEntryRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
namespace MoneyFox.Droid.Renderer
{
    public class CustomEntryRenderer : MaterialEntryRenderer
    {
        public CustomEntryRenderer(Context context) : base(context) {
        }

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

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

            JNIEnv.SetField(Control.EditText.Handle, mCursorDrawableResProperty, Resource.Drawable.CustomCursor);

            // try set cursor pointer color
            try
            {
                TextView textViewTemplate = new TextView(Control.EditText.Context);

                var field = textViewTemplate.Class.GetDeclaredField("mEditor");
                field.Accessible = true;
                var editor = field.Get(Control.EditText);

                String[]
                    fieldsNames = { "mTextSelectHandleLeftRes", "mTextSelectHandleRightRes", "mTextSelectHandleRes" },
                    drawablesNames = { "mSelectHandleLeft", "mSelectHandleRight", "mSelectHandleCenter" };

                for (Int32 index = 0; index < fieldsNames.Length && index < drawablesNames.Length; index++)
                {
                    String
                        fieldName = fieldsNames[index],
                        drawableName = drawablesNames[index];

                    field = textViewTemplate.Class.GetDeclaredField(fieldName);
                    field.Accessible = true;
                    Int32 handle = field.GetInt(Control.EditText);

                    Drawable handleDrawable = Resources.GetDrawable(handle, null);

                    handleDrawable.SetColorFilter(Color.Accent.ToAndroid(), PorterDuff.Mode.SrcIn);

                    field = editor.Class.GetDeclaredField(drawableName);
                    field.Accessible = true;
                    field.Set(editor, handleDrawable);
                }
            } 
            catch (Exception ex)
            {
                LogManager.GetCurrentClassLogger().Error(ex);
            }
        }
    }
}
[程序集:ExportRenderer(typeof(Entry)、typeof(CustomEntryRenderer)、new[]{typeof(VisualMarker.MaterialVisual)}]
命名空间MoneyFox.Droid.Renderer
{
公共类CustomEntryRenderer:MaterialEntryRenderer
{
公共CustomEntryRenderer(上下文):基本(上下文){
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e){
基础。一个要素发生变化(e);
//设置光标颜色
IntPtr IntPtrtextViewClass=JNIEnv.FindClass(typeof(TextView));
IntPtr mCursorDrawableResProperty=JNIEnv.GetFieldID(IntPtrtextViewClass,“mcursordrawables”,“I”);
SetField(Control.EditText.Handle、mCursorDrawableResProperty、Resource.Drawable.CustomCursor);
//尝试设置光标指针颜色
尝试
{
TextView textViewTemplate=新的TextView(Control.EditText.Context);
var field=textViewTemplate.Class.GetDeclaredField(“mEditor”);
field.Accessible=true;
var editor=field.Get(Control.EditText);
字符串[]
fieldsNames={“MTEXTSELECTHANDLEFTRES”、“MTEXTSELECTHANDLERIGHTERS”、“mTextSelectHandleRes”},
drawablesNames={“mSelectHandleLeft”、“mSelectHandleRight”、“mSelectHandleCenter”};
对于(Int32 index=0;index

在那里,我可以调用Control.EditText.Handle,它可以访问本机控件。不幸的是,这对于效果是不可访问的。

Xamarin Forms没有为控件光标颜色公开任何api,您必须创建一个api来更改该行为。@FabriBertani感谢您的回复!我试图创造一种效果,但到目前为止没有成功。我把最后一个版本添加到我原来的帖子中。也许你知道怎么回事了。你能把你试过的效果的演示贴出来吗?Xamarin Forms不公开任何api来控制
[assembly: ExportRenderer(typeof(Entry), typeof(CustomEntryRenderer), new[] { typeof(VisualMarker.MaterialVisual) })]
namespace MoneyFox.Droid.Renderer
{
    public class CustomEntryRenderer : MaterialEntryRenderer
    {
        public CustomEntryRenderer(Context context) : base(context) {
        }

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

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

            JNIEnv.SetField(Control.EditText.Handle, mCursorDrawableResProperty, Resource.Drawable.CustomCursor);

            // try set cursor pointer color
            try
            {
                TextView textViewTemplate = new TextView(Control.EditText.Context);

                var field = textViewTemplate.Class.GetDeclaredField("mEditor");
                field.Accessible = true;
                var editor = field.Get(Control.EditText);

                String[]
                    fieldsNames = { "mTextSelectHandleLeftRes", "mTextSelectHandleRightRes", "mTextSelectHandleRes" },
                    drawablesNames = { "mSelectHandleLeft", "mSelectHandleRight", "mSelectHandleCenter" };

                for (Int32 index = 0; index < fieldsNames.Length && index < drawablesNames.Length; index++)
                {
                    String
                        fieldName = fieldsNames[index],
                        drawableName = drawablesNames[index];

                    field = textViewTemplate.Class.GetDeclaredField(fieldName);
                    field.Accessible = true;
                    Int32 handle = field.GetInt(Control.EditText);

                    Drawable handleDrawable = Resources.GetDrawable(handle, null);

                    handleDrawable.SetColorFilter(Color.Accent.ToAndroid(), PorterDuff.Mode.SrcIn);

                    field = editor.Class.GetDeclaredField(drawableName);
                    field.Accessible = true;
                    field.Set(editor, handleDrawable);
                }
            } 
            catch (Exception ex)
            {
                LogManager.GetCurrentClassLogger().Error(ex);
            }
        }
    }
}