【问题标题】:Is it possible to change the colour of the line below / Border of a TextBox (Entry)是否可以更改文本框下方线条/边框的颜色(条目)
【发布时间】:2016-11-07 12:16:05
【问题描述】:

我正在Android 上创建一个Xamarin.Forms 应用程序,并且我正在尝试更改我的Xamarin.Forms Entry 控件下方线条的颜色。

我有一个像这样的Entry 控件:

<Entry Text="new cool street"/>

我想将此 Entry 下面的行的颜色从默认的白色更改为更多的紫色以匹配我的主题。

如果可能的话,最好使用 Android 样式,因为它适用于从 Entry 继承的所有控件

这样可以吗?

【问题讨论】:

  • 用户安卓样式。 &lt;item name="colorAccent"&gt;@android:color/yourcolour&lt;/item&gt;
  • @AkashAmin colorAccent 仅在 TextBox 被聚焦时使用。我希望在 TextBox 未聚焦时更改线条颜色

标签: c# android xamarin xamarin.forms


【解决方案1】:

您可以使用会影响所有条目的自定义渲染器,

这是安卓版:

[assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))]
namespace Android.MyRenderers
{
    public class MyEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

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

            if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                Control.BackgroundTintList = ColorStateList.ValueOf(Color.White);
            else
                Control.Background.SetColorFilter(Color.White, PorterDuff.Mode.SrcAtop);
         }    
    }
}

和 iOS:

[assembly: ExportRenderer (typeof(Entry), typeof(MyEntryRenderer))]
namespace iOS.MyRenderers
{
    public class MyEntryRenderer : EntryRenderer
    {
        private CALayer _line;

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

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

            Control.BorderStyle = UITextBorderStyle.None;

            _line = new CALayer {
                BorderColor = UIColor.FromRGB(174, 174, 174).CGColor,
                BackgroundColor = UIColor.FromRGB(174, 174, 174).CGColor,
                Frame = new CGRect (0, Frame.Height / 2, Frame.Width * 2, 1f)
            };

            Control.Layer.AddSublayer (_line);
        }
    }
}

不确定这方面的 Windows 解决方案

【讨论】:

  • 您的示例适用于什么平台,您知道我在哪里可以找到其他两个示例的代码吗?
  • @user1,这是安卓,刚刚添加了iOS
  • 谢谢,太好了!如果我发现了,我会查看 windows 并添加它
  • 我想吻你!谢谢老兄
  • 你遇到过ios入口底线宽度问题吗?
【解决方案2】:

我遇到了同样的问题,只需更改 styles.xml(在 Xamarin.Android 项目中)中的 colorAccent 值就会改变光标的颜色和Entry 字段的底部边框。

<item name="colorAccent">#BA55D3</item>

【讨论】:

  • 看起来只有当控件有焦点时才会改变颜色。
  • 聚焦:#FF73B72F 未聚焦:#FF73B72F"
【解决方案3】:

由于我的内容页面具有一种背景颜色,而对话框具有另一种背景颜色,因此使用样式来指定底栏颜色是完全错误的答案。而且由于OP只询问Android,这只是Android...

我使用自定义渲染器将底部栏颜色设置为与文本颜色相同。必须同时使用 ElementChanged 和 PropertyChanged。

[assembly: ExportRenderer(typeof(Xamarin.Forms.Entry), typeof(CustomEntryRenderer))]
namespace XamFormsConnect.Droid
{
    public class CustomEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null && e.NewElement != null)
            {
                var entry = (Xamarin.Forms.Entry)e.NewElement;
                if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                    Control.BackgroundTintList = ColorStateList.ValueOf(entry.TextColor.ToAndroid());
                else
                    Control.Background.SetColorFilter(entry.TextColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == "TextColor")
            {
                var entry = (Xamarin.Forms.Entry)sender;
                if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                    Control.BackgroundTintList = ColorStateList.ValueOf(entry.TextColor.ToAndroid());
                else
                    Control.Background.SetColorFilter(entry.TextColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
        }
    }
}

【讨论】:

  • 我喜欢这个答案如何使用 TextColor 属性,而不是像接受的答案那样硬编码“白色”。
【解决方案4】:

更新: Xamarin.Forms 2.5

我尝试了top rated solution,但出现错误:“上下文从 2.5 版开始已过时。请改用本地上下文”。

经过一番快速搜索:

代码需要更新:

using <YOUR_APP_NAME>.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Android.Content;
using Android.OS;
using Android.Content.Res;
using Android.Graphics;

[assembly: ExportRenderer(typeof(Entry), typeof(MyRenderers))]
namespace Android.MyRenderers
{
    public class MyRenderers : EntryRenderer
    {

        public MyRenderers(Context context) : base(Android.App.Application.Context)
        {

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

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

            if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.Ivory);
            else
                Control.Background.SetColorFilter(Android.Graphics.Color.Ivory, PorterDuff.Mode.SrcAtop);
        }
    }
}

谁需要更新。

【讨论】:

    【解决方案5】:

    简单: 将您的 res/values/colors.xml 编辑为: #303F9F

    您可以使用任何十六进制颜色代码代替#303F9F

    <color name="colorPrimaryDark">#303F9F</color>
    

    【讨论】:

    【解决方案6】:

    如果有人在使用root 的 iOS 自定义渲染器时遇到宽度或 y 位置异常,我找到了解决方案。

    1. 包括条目和另外两个变量作为类字段:
    private CustomEntry _entry;
    private double _yPos;
    private double _width;
    
    1. 在OnElementChanged中赋值:
    if (e.NewElement != null)
        _entry = e.NewElement as CustomEntry;
    
    1. 在OnElementPropertyChanged 中,包括以下内容:
    if (e.PropertyName == "Width")
    {
        _width = _entry.Width;
    }
    else if (e.PropertyName == "Height")
    {
        _yPos = _entry.Height;
    }
    _line.Frame = new CGRect(0, _yPos, _width, 1f);
    

    【讨论】:

      【解决方案7】:

      如果您使用的是 Xamarin 表单,请转到 Mobile.Droid、资源、值并在“您的颜色”上,它会起作用。

      【讨论】:

        【解决方案8】:

        您可以使用的另一个简单的视觉解决方案就是隐藏这一行:

        <Grid>
           <Entry Placeholder="Your Entry"/>
           <BoxView BackgroundColor="White" HeightRequest="10"/>
        </Grid>
        

        您可以通过创建自己的组件而不是使用硬编码颜色来改进它。

        【讨论】:

          【解决方案9】:

          在android中将输入光标和下划线颜色从粉红色更改。这可以通过将&lt;item name="colorControlActivated"&gt;#007bff&lt;/item&gt; 添加到您的styles.xml 文件来实现,该文件位于Xamarin 表单Android 项目的Resources/values 文件夹中。

          注意:这种方法会将更改应用到应用中的每个元素。如果不需要,请使用自定义渲染器方法。

          可以参考xamarin forums这个答案

          【讨论】:

            【解决方案10】:

            上述解决方案已过时。这里的这个是推荐的。 (还有所有必要的用途。有时会让人困惑......)

            using System;
            using System.ComponentModel;
            using Android.Content;
            using Android.Content.Res;
            using InteriorCircle.Droid.CustomComp;
            using Xamarin.Forms;
            using Xamarin.Forms.Platform.Android;
            
            [assembly: ExportRenderer(typeof(Entry), typeof(CustomEntry))]
            namespace InteriorCircle.Droid.CustomComp
            {
                public class CustomEntry : EntryRenderer
                {
                    public CustomEntry(Context context) : base(context)
                    {
            
                    }
                    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
                    {
                        base.OnElementChanged(e);
            
                        if (Control == null || e.NewElement == null) return;
            
                        Control.BackgroundTintList = Android.Content.Res.ColorStateList.ValueOf(Android.Graphics.Color.Black);
                    }
            
                    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
                    {
                        base.OnElementPropertyChanged(sender, e);
                        if (e.PropertyName == Entry.TextProperty.PropertyName)
                        {
                            if (Control.Text.Length > 6)  //this is your condition(For example, here is the length of the text content)
                            {
                                Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.Red);
                            }
                            else
                            {
                                Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.Black);
                            }
                        }
                    }
            
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2021-08-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-02-12
              • 1970-01-01
              • 2011-06-24
              • 1970-01-01
              相关资源
              最近更新 更多