自定义选择器Xamarin Android 注意:确保项目的目标框架是最新的稳定版本Android Q

问题描述

我有一个选择器。请告诉我如何更改标题的颜色,项目的颜色以及删除这些行

enter image description here

我有我的自定义选择器,可以更改按钮的颜色取消,确定 我试图删除线 https://forums.xamarin.com/discussion/78693/how-can-i-remove-the-picker-borders-in-forms-for-android 但它不起作用 如何更改我不知道的SELECT CAR和AUDI的颜色

enter image description here

[2]: https://i.stack.imgur.com/tbKsC.png

解决方法

您可以使用自定义渲染器

来实现它
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using App12.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Color = Android.Graphics.Color;
using Orientation = Android.Widget.Orientation;

[assembly: ExportRenderer(typeof(Picker),typeof(MyPickerRenderer))]
namespace App12.Droid
{
    public class MyPickerRenderer:PickerRenderer
    {
        IElementController ElementController => Element;


        public MyPickerRenderer(Context context) : base(context)
        {
         

        }


        private AlertDialog _dialog;


        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
            Control.Click += Control_Click;

            Control.SetHintTextColor(Android.Graphics.Color.Red);
            Control.SetSingleLine(true);
            Control.SetTypeface(null,TypefaceStyle.Bold);
            Control.Gravity = GravityFlags.Center;

            var gd = new GradientDrawable();
            gd.SetStroke(0,Android.Graphics.Color.Transparent);
            Control.SetBackground(gd);

        }


        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                Control.Click -= Control_Click;
                //var picker = (Picker)Element;
                //picker.PropertyChanged -= Control_Click;
            }


            base.Dispose(disposing);
        }

        private void Control_Click(object sender,EventArgs e)
        {
            Picker model = Element;
           
            picker.SelectionDividerHeight = 0;

            var picker = new TextColorNumberPicker(Context);

            if (model.Items != null && model.Items.Any())
            {
                // set style here

                picker.MaxValue = model.Items.Count - 1;
                picker.MinValue = 0;

              
                picker.SetDisplayedValues(model.Items.ToArray());
                picker.WrapSelectorWheel = false;
                picker.Value = model.SelectedIndex;

            }


            var layout = new LinearLayout(Context) { Orientation = Orientation.Vertical };
            layout.AddView(picker);

            var titleView = new TextView(Context);

            titleView.Text = "Select a car";
            titleView.TextSize = 20;
            titleView.SetTextColor(Color.Red);
            titleView.SetBackgroundColor(Color.White);

            ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty,true);

            var builder = new AlertDialog.Builder(Context);
            builder.SetView(layout);

            builder.SetTitle(model.Title ?? "");

            builder.SetCustomTitle(titleView);
            builder.SetNegativeButton("Cancel  ",(s,a) =>
            {
                ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty,false);
                // It is possible for the Content of the Page to be changed when Focus is changed.
                // In this case,we'll lose our Control.
                Control?.ClearFocus();
                _dialog = null;
            });
            builder.SetPositiveButton("Ok ",a) =>
            {
                ElementController.SetValueFromRenderer(Picker.SelectedIndexProperty,picker.Value);
                // It is possible for the Content of the Page to be changed on SelectedIndexChanged.
                // In this case,the Element & Control will no longer exist.
                if (Element != null)
                {
                    if (model.Items.Count > 0 && Element.SelectedIndex >= 0)
                        Control.Text = model.Items[Element.SelectedIndex];
                    ElementController.SetValueFromRenderer(VisualElement.IsFocusedProperty,false);
                    // It is also possible for the Content of the Page to be changed when Focus is changed.
                    // In this case,we'll lose our Control.
                    Control?.ClearFocus();
                }
                _dialog = null;
            });


            _dialog = builder.Create();
            _dialog.DismissEvent += (ssender,args) =>
            {
                ElementController?.SetValueFromRenderer(VisualElement.IsFocusedProperty,false);
            };
            _dialog.Show();

            Android.Widget.Button btnOk = _dialog.GetButton((int)Android.Content.DialogButtonType.Positive);
            btnOk.SetTextColor(Android.Graphics.Color.Blue);

            Android.Widget.Button btnCancel = _dialog.GetButton((int)Android.Content.DialogButtonType.Positive);
            btnCancel.SetTextColor(Android.Graphics.Color.Gray);
        }



        
    }


    public class TextColorNumberPicker : NumberPicker
    {
        public TextColorNumberPicker(Context context) : base(context)
        {

        }

        public override void AddView(Android.Views.View child,int index,ViewGroup.LayoutParams @params)
        {
            base.AddView(child,index,@params);
            UpdateView(child);
        }

        public void UpdateView(Android.Views.View view)
        {
            if (view is EditText)
            {


                ((EditText)view).SetTextColor(Color.Red);  // set item text color 


            }
        }
    }

}

注意:确保项目的目标框架是最新的稳定版本(Android Q)。

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...