我正在Xamarin.Forms
创建一个Android
应用,我正在尝试更改Xamarin.Forms
Entry
控件下方的行颜色。
我有一个Entry
控件,如下:
<Entry Text="new cool street"/>
我想将此Entry
下方的线条颜色从默认白色更改为紫色,以匹配我的主题。
理想情况下,最好使用Android样式,因为它适用于从Entry
继承的所有控件(如果可能)
这可能吗?
答案 0 :(得分:24)
您可以使用会影响所有条目的自定义渲染器,
这里是android:
[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解决方案不确定答案 1 :(得分:7)
我遇到了同样的问题,只是更改 styles.xml 中的Entry
值(在 Xamarin.Android 项目中)将更改游标的颜色以及<item name="colorAccent">#BA55D3</item>
字段的下边框。
library(readxl)
答案 2 :(得分:3)
简单: 将res / values / colors.xml编辑为: #303F9F
您可以放置任何十六进制颜色代码来代替#303F9F
<color name="colorPrimaryDark">#303F9F</color>
答案 3 :(得分: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);
}
}
}
}
答案 4 :(得分:1)
如果有人在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);
答案 5 :(得分:1)
更新: Xamarin.Forms 2.5
我正在尝试使用评分最高的解决方案(https://stackoverflow.com/a/38227299/11630806),并出现错误:“从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);
}
}
}
谁需要更新。
答案 6 :(得分:0)
如果您使用的是Xamarin Forms,请转到Mobile.Droid,资源,值以及&#34; Your Colur&#34;,它将起作用。
答案 7 :(得分:0)
您可以使用的另一种简单的视觉解决方案就是隐藏此行:
<Grid>
<Entry Placeholder="Your Entry"/>
<BoxView BackgroundColor="White" HeightRequest="10"/>
</Grid>
您可以通过创建自己的组件而不是使用硬编码的颜色来改进它。
答案 8 :(得分:0)
在android中将输入光标和下划线颜色从粉红色更改。只需在您的styles.xml文件中添加<item name="colorControlActivated">#007bff</item>
即可实现,该文件位于Xamarin表单Android项目的Resources / values文件夹中。
注意:这种方法会将更改应用于应用程序中的每个元素。如果不需要,请使用自定义渲染器方法。
可以参考xamarin forums
的答案