shuhelohelo’s blog

Xamarin.Forms多めです.

Xamarin.FormsでEntryコントロールのカーソル関連の色を変える方法

カスタムレンダラーから変更する方法がよくわからなかった.

stackoverflow.com

↑の記事によると,カスタムレンダラに追加すれば良いとのこと.

IntPtr IntPtrtextViewClass = JNIEnv.FindClass(typeof(TextView));
IntPtr mCursorDrawableResProperty = JNIEnv.GetFieldID (IntPtrtextViewClass, "mCursorDrawableRes", "I");
JNIEnv.SetField (Control.Handle, mCursorDrawableResProperty, 0); // replace 0 with a Resource.Drawable.my_cursor

これはまだ試していない.

成功したのはstyles.xmlに以下を記述する方法. AndroidプロジェクトのResources/values/styles.xml内に以下を追加する.

  <style name="MainTheme" parent="MainTheme.Base">
    <item name="colorAccent">#F99014</item><!-- これ -->
  </style>

stackoverflow.com

確かにこれでカーソルとバブル(カーソルの下のつまみ)の色,どころかアクセントカラーが全て変わる. これが正しいのかはわからない. f:id:shuhelohelo:20200125091949p:plain

カスタムレンダラーでEntryの下線の色を変更する

以下のようにカスタムレンダラーでEntryコントロールの下線の色を変更すると,styles.xmlの設定を上書きする形で表示される.

Entryコントロールの下線の色の変更は以下のとおり. shuhelohelo.hatenablog.com

(名前空間は適宜変更してください)

using Android.Content;
using Android.Content.Res;
using Android.OS;
using TakeMeThereXamarinForms.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))]
namespace TakeMeThereXamarinForms.Droid.Renderers
{
    class MyEntryRenderer : EntryRenderer
    {
        public MyEntryRenderer(Context context) : base(context)
        {
        }

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

            if (Control == null || e.NewElement == null) return;

            if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
            {
                //下線の色を変更
                var color = Xamarin.Forms.Color.FromHex("#9BFFE6");
                Control.BackgroundTintList = ColorStateList.ValueOf(color.ToAndroid());
            }
        }
    }
}

↓下線だけ明るい水色に. f:id:shuhelohelo:20200125095644p:plain

カーソルもつまみも全部カスタムレンダラーでできたら変更が一箇所にまとまってすっきりするんだけれどな.

うーん,簡単だろうと思ったことが難しかったりする