Может ли кто-нибудь придумать решение Custom Renderer для изменения цвета подчеркивания в Android? - PullRequest
6 голосов
/ 18 июня 2020

У меня есть приложение форм 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>

Представления iOS и Android выглядят так:

введите описание изображения здесь

Есть ли способ изменить цвет подчеркивания Android, а также (если возможно) расстояние между подчеркиванием и цифрами.

1 Ответ

6 голосов
/ 20 июня 2020

Если вы используете sh, чтобы удалить подчеркивание, вам нужно сделать это в 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;
            }
        }
    }
}

Если вы используете sh, чтобы изменить подчеркивание color, вам необходимо создать ресурс списка состояний Color .

В проекте Android в папке Resources создайте новый каталог Color. В нем создайте файл xml, описывающий selector drawable. Назовем его 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>

Здесь вы можете многое изменить, но в селекторе 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;
    }
}

Вот работающий gif:

enter image description here

You don't need to change the "gap", just adjust your layout, because currently the issue is not with the default offset, but with the way the layout is being rendered. Changing the offset should be considered a last resort.

However, if you still want to change the bottom padding between the text and the bottom border, again, in the OnElementChanged method, set the Control's padding like this:

Control.SetPadding(0, 0, 0, 120);

Здесь , Я установил только нижний отступ 120.

NB: создание средства визуализации, которое переопределит все элементы, не считается хорошим подходом. Здесь для простоты я экспортирую средства визуализации для встроенного типа Entry. Лучше обернуть Entry внутри вашего собственного CustomEntry класса, чтобы не изменять стили глобально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...