是否可以更改文本框下方线条/边框的颜色(条目)
Posted
技术标签:
【中文标题】是否可以更改文本框下方线条/边框的颜色(条目)【英文标题】: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
继承的所有控件
这样可以吗?
【问题讨论】:
用户安卓样式。<item name="colorAccent">@android:color/yourcolour</item>
@AkashAmin colorAccent
仅在 TextBox
被聚焦时使用。我希望在 TextBox
未聚焦时更改线条颜色
How to change Border Color of Entry in 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>
【讨论】:
看起来只有当控件有焦点时才会改变颜色。 聚焦:由于我的内容页面具有一种背景颜色,而对话框具有另一种背景颜色,因此使用样式来指定底栏颜色是完全错误的答案。而且由于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 版开始已过时。请改用本地上下文”。
经过一番快速搜索:
Xamarin.Forms 2.5.0 and Context https://forums.xamarin.com/discussion/106938/context-is-obsolete-as-of-version-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>
【讨论】:
我在哪里实现这个颜色以将它应用到我的Entry
?到目前为止,这只是定义一个新的颜色
请参阅https://developer.xamarin.com/guides/android/user_interface/material_theme/ 了解我的意思的更多信息【参考方案6】:
如果有人在使用root 的 iOS 自定义渲染器时遇到宽度或 y 位置异常,我找到了解决方案。
-
包括条目和另外两个变量作为类字段:
private CustomEntry _entry;
private double _yPos;
private double _width;
-
在
OnElementChanged
中赋值:
if (e.NewElement != null)
_entry = e.NewElement as CustomEntry;
-
在
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中将输入光标和下划线颜色从粉红色更改。这可以通过将<item name="colorControlActivated">#007bff</item>
添加到您的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);
【讨论】:
以上是关于是否可以更改文本框下方线条/边框的颜色(条目)的主要内容,如果未能解决你的问题,请参考以下文章
在 nativescript 中使用 RadDataForm 聚焦时更改文本字段的线条颜色