出生日期的 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_FULL
和 AUTOFILL_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 自动填充框架提示常量的主要内容,如果未能解决你的问题,请参考以下文章