Search code examples
c#xamarinxamarin.formsxamarin.androidcustom-renderer

Custom Picker Xamarin Android


I have a picker.Please,tell me how to change color of title, the color of items and remove these lines

enter image description here

I have my custompicker and I could change colors of buttons CANCEL,OK I tried to remove lines https://forums.xamarin.com/discussion/78693/how-can-i-remove-the-picker-borders-in-forms-for-android but it does not work How to change color of SELECT A CAR and AUDI I do not know

enter image description here

[2]: https://i.sstatic.net/tbKsC.png


Solution

  • You could implement it by using Custom Renderer

    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 ", (s, 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 
    
    
                }
            }
        }
    
    }
    

    Note : Make sure the Target Framework of the project is the latest stable version (Android Q) .

    enter image description here