任何人都可以提出自定义渲染器解决方案来更改 Android 中下划线的颜色吗?

Ala*_*an2 6 android xamarin xamarin.forms

我有一个使用此代码的 Xamarin 表单应用程序:

<Grid
    HeightRequest="50"
    VerticalOptions="CenterAndExpand"
    x:Class="J.Templates.EntryGrid"
    x:Name="this"
    xmlns ="http://xamarin.com/schemas/2014/form
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition x:Name="lastColumnWidth" Width="150"/>
    </Grid.ColumnDefinitions>
    <Label Grid.Column="0" Text="{Binding Text1, Source={x:Reference this}}"  />
    <Entry Grid.Column="1"
               HorizontalOptions="FillAndExpand"
               HorizontalTextAlignment="End"
               VerticalOptions="FillAndExpand"
               TextColor="{DynamicResource LabelLinkColor}"
               Keyboard="{Binding EntryKeyboardType,  Source={x:Reference this}}"
               Text="{Binding EntryText,  Source={x:Reference this}}"
               FontSize="{DynamicResource LabelTextFontSize}"
               FontFamily="{DynamicResource DefaultFont}"
               BackgroundColor="Transparent"
    </Entry>
</Grid>
Run Code Online (Sandbox Code Playgroud)

iOS 和 Android 视图如下所示:

在此处输入图片说明

有什么方法可以更改 Android 下划线颜色以及(如果可能)下划线和数字之间的间距。

Mih*_*hev 6

如果您想删除下划线,则必须在Custom Renderer 中进行

[assembly: ExportRenderer(typeof(Entry), typeof(CustomEntryRenderer))]
namespace CustomEntryUnderline.Android
{
    public class CustomEntryRenderer : EntryRenderer
    {
        public CustomEntryRenderer(Context context)
            : base(context)
        {
        }

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

            if (Control != null)
            {
                Control.Background = null;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望更改下划线颜色,您必须创建一个颜色状态列表资源

在Android项目的Resources文件夹下,新建一个目录Color。在其中,创建一个 xml 文件,描述selector可绘制对象。让我们称之为editable_selector.xml。这是它的样子:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#00ff00"/>
    <item android:state_focused="true" android:color="#ff0000"/>
    <item android:state_active="false" android:color="#0000ff"/>
</selector>
Run Code Online (Sandbox Code Playgroud)

在这里,您可以更改很多内容,但是在 xml 选择器中,我将边框默认设置为蓝色,按下时为绿色,聚焦时为红色。

然后在您的渲染器中,您必须设置本机视图的BackgroundTintList。我们将在OnElementChanged方法中再次这样做。

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
    base.OnElementChanged(e);
    if (Control != null)
    {
        var colorStateList = Context.GetColorStateList(Resource.Color.editable_selector);
        Control.BackgroundTintList = colorStateList;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个正在运行的gif:

在此处输入图片说明

您不需要更改“间隙”,只需调整您的布局,因为目前问题不在于默认偏移量,而在于呈现布局的方式。更改偏移量应被视为最后的手段。

但是,如果您仍然想更改文本和底部边框之间的底部填充,再次在OnElementChanged方法中,将Control's padding设置为:

Control.SetPadding(0, 0, 0, 120);
Run Code Online (Sandbox Code Playgroud)

在这里,我只设置了 120 的底部填充。

注意:创建覆盖所有元素的渲染器并不是一个好方法。在这里,为简单起见,我导出内置Entry类型的渲染器。最好将其包装Entry在您自己的CustomEntry类中,以免全局修改样式。