出生日期的 Xamarin.Android 自动填充框架提示常量

Posted

技术标签:

【中文标题】出生日期的 Xamarin.Android 自动填充框架提示常量【英文标题】:Xamarin.Android autofill framework hint constant for Date of Birth 【发布时间】:2020-11-18 13:57:43 【问题描述】:

我正在根据here 给出的详细信息针对 android Autofill 框架优化我的应用。

但我观察到有很多额外的 Autofill Hint Constants 在 Xamarin Android 中不可用。

有什么方法可以在 Xamarin 中使用这个提示常量。

我的应用程序中有 AUTOFILL_HINT_BIRTH_DATE_FULLAUTOFILL_HINT_BIRTH_DATE_FULL 常量的特定要求。

我正在使用所有 Xamarin.Android.Support 软件包的最新版本 (28.0.0.3)。

【问题讨论】:

【参考方案1】:

在 Xamarin.Forms 中,您可以使用自动填充效果。

自动填充效果:创建一个 AutofillEffect.cs

public class AutofillEffect : RoutingEffect

    public AutofillEffect() : base("YourProjectName." + nameof(AutofillEffect)) 
    
    

AutofillContentType 是一个可枚举类型,列出了所有支持的自动填充条目。

 public enum AutofillHintType

    EmailAddress,
    Name,
    Phone,  

添加视图可以使用的 AttachedProperty。

using FormsElement = Xamarin.Forms.Entry;

public static class Entry

    const string EffectName = "YourProjectName." + nameof(AutofillEffect);

    public static readonly BindableProperty AutofillHintProperty =
        BindableProperty.CreateAttached(nameof(AutofillHint),
                                        typeof(AutofillHintType),
                                        typeof(Entry),
                                        AutofillHintType.None,
                                        propertyChanged: OnAutofillHintPropertyChanged);

    public static AutofillHintType GetAutofillHint(BindableObject element)
    
        return (AutofillHintType)element.GetValue(AutofillHintProperty);
    

    public static void SetAutofillHint(BindableObject element, AutofillHintType value)
    
        element.SetValue(AutofillHintProperty, value);
    

    private static void OnAutofillHintPropertyChanged(BindableObject element, object oldValue, object newValue)
    
        if ((AutofillHintType)newValue != AutofillHintType.None)
        
            AttachEffect(element as FormsElement);
        
        else
        
            DetachEffect(element as FormsElement);
        
    

    private static void AttachEffect(FormsElement element)
    
        IElementController controller = element;
        if (controller == null || controller.EffectIsAttached(EffectName))
        
            return;
        
        element.Effects.Add(Effect.Resolve(EffectName));
    

    private static void DetachEffect(FormsElement element)
    
        IElementController controller = element;
        if (controller == null || !controller.EffectIsAttached(EffectName))
        
            return;
        

        var toRemove = element.Effects.FirstOrDefault(e => e.ResolveId == Effect.Resolve(EffectName).ResolveId);
        if (toRemove != null)
        
            element.Effects.Remove(toRemove);
        
    

    public static AutofillHintType AutofillHint(this IPlatformElementConfiguration<Android, FormsElement> config)
    
        return GetAutofillHint(config.Element);
    

    public static IPlatformElementConfiguration<Android, FormsElement> SetAutofillHint(this IPlatformElementConfiguration<Android, FormsElement> config, AutofillHintType value)
    
        SetAutofillHint(config.Element, value);
        return config;
    


Android效果实现:

[assembly: ResolutionGroupName("YourProjctName")]
[assembly: ExportEffect(typeof(YourProjctName.Droid.AutofillEffect), "AutofillEffect")]
namespace YourProjctName.Droid

   public class AutofillEffect : PlatformEffect
  

    protected override void OnAttached()
    
        try
        
            if (!IsSupported())
                return;

            var control = Control as Android.Widget.EditText;

            var hint = GetAndroidAutofillHint();
            control.ImportantForAutofill = Android.Views.ImportantForAutofill.Yes;
            control.SetAutofillHints(hint);
        
        catch (Exception ex)
        
            Console.WriteLine("Cannot set property on attached control. Error: 0", ex.Message);
        
    

    protected override void OnDetached()
    
        if (!IsSupported())
            return;

        Control.SetAutofillHints(string.Empty);

        Control.ImportantForAutofill = Android.Views.ImportantForAutofill.Auto;
    

    private bool IsSupported()
    
        return Element as Entry != null && 
               Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O;
    

    private string GetAndroidAutofillHint()
    
        var hint = ((Entry)Element).OnThisPlatform().AutofillHint();
        var constantValue = GetEnumDescription(hint);
        return constantValue;
    

    private static string GetEnumDescription(Enum value)
    
        FieldInfo fi = value.GetType().GetField(value.ToString());

        DescriptionAttribute[] attributes =
            (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

        return attributes != null && attributes.Length > 0 ? attributes[0].Description : value.ToString();
    



用法:

XAML:

   <Entry HorizontalOptions="Fill"
           Placeholder="Your name"
           Keyboard="Text"
           android:Entry.AutofillHint="Name">

代码隐藏:

  PhoneEntry.On<Android>().SetAutofillHint(AutofillHintType.Phone);

截图:

如果你想使用这个自动填充,你需要保存一些信息。在截图中,我使用了 Google Autofill 的数据。

【讨论】:

以上是关于出生日期的 Xamarin.Android 自动填充框架提示常量的主要内容,如果未能解决你的问题,请参考以下文章

EXECL如何通过出生日期自动提取年龄????

sql 从身份证中自动获取出生日期,显示格式为XXXX-XX-XX

excel表格输入了出生年月怎么自动生成年龄,详细一点

如何用jQuery实现输入身份证号码后,出生日期自动生成

根据身份证自动获取年龄/出生日期

根据身份证号码自动获取出生日期,性别,籍贯