gpt4 book ai didi

xamarin - 在Xamarin Forms Shared Project中将return更改为next/done键

转载 作者:行者123 更新时间:2023-12-03 10:23:35 25 4
gpt4 key购买 nike

是否可以将键盘上“返回”键中的文本更改为“下一个”或“完成”?我有一个使用用户名和密码的登录表单。我希望返回键在用户名字段上说“next”,然后在密码字段上说“done”,但无论如何都没有看到。
这适用于android和iOS共享项目。

Username

Password

最佳答案

自定义EntryRenderer可以处理更改键盘返回键的描述。

  • iOS:UITextField具有ReturnKeyType属性,您可以将其设置为预分配的列表(请参阅UIReturnType枚举)。
  • Android:EntryEditText具有ImeOptions属性和SetImeActionLabel方法,该属性可控制键盘上的“操作”按钮的功能,该方法可用于为其设置任何文本字符串。

  • enter image description here

    定制Entry / EntryRenderer的用法示例:

    new EntryExt {
    Text = "Next Key",
    ReturnKeyType = ReturnKeyTypes.Next
    },
    new EntryExt {
    Text = "Done Key",
    ReturnKeyType = ReturnKeyTypes.Done
    }
    Xamarin.Forms自定义 Entry类:

    namespace YourNameSpaceHere
    {
    public class EntryExt : Entry
    {
    public const string ReturnKeyPropertyName = "ReturnKeyType";

    public EntryExt() { }

    public static readonly BindableProperty ReturnKeyTypeProperty = BindableProperty.Create(
    propertyName: ReturnKeyPropertyName,
    returnType: typeof(ReturnKeyTypes),
    declaringType: typeof(EntryExt),
    defaultValue: ReturnKeyTypes.Done);

    public ReturnKeyTypes ReturnKeyType
    {
    get { return (ReturnKeyTypes)GetValue(ReturnKeyTypeProperty); }
    set { SetValue(ReturnKeyTypeProperty, value); }
    }
    }

    // Not all of these are support on Android, consult EntryEditText.ImeOptions
    public enum ReturnKeyTypes : int
    {
    Default,
    Go,
    Google,
    Join,
    Next,
    Route,
    Search,
    Send,
    Yahoo,
    Done,
    EmergencyCall,
    Continue
    }
    }

    iOS自定义 EntryRenderer:

    [assembly: ExportRenderer(typeof(Entry), typeof(EntryExtRenderer_iOS))]
    namespace KeyboardDone.iOS
    {
    public class EntryExtRenderer_iOS : EntryRenderer
    {
    public EntryExtRenderer_iOS() { }

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
    base.OnElementChanged(e);
    if ((Control != null) && (e.NewElement != null))
    Control.ReturnKeyType = (e.NewElement as EntryExt).ReturnKeyType.GetValueFromDescription();
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
    base.OnElementPropertyChanged(sender, e);
    if (e.PropertyName == EntryExt.ReturnKeyPropertyName)
    {
    D.WriteLine($"{(sender as EntryExt).ReturnKeyType.ToString()}");
    Control.ReturnKeyType = (sender as EntryExt).ReturnKeyType.GetValueFromDescription();
    }
    }
    }

    public static class EnumExtensions
    {
    public static UIReturnKeyType GetValueFromDescription(this ReturnKeyTypes value)
    {
    var type = typeof(UIReturnKeyType);
    if (!type.IsEnum) throw new InvalidOperationException();
    foreach (var field in type.GetFields())
    {
    var attribute = Attribute.GetCustomAttribute(field,
    typeof(DescriptionAttribute)) as DescriptionAttribute;
    if (attribute != null)
    {
    if (attribute.Description == value.ToString())
    return (UIReturnKeyType)field.GetValue(null);
    }
    else
    {
    if (field.Name == value.ToString())
    return (UIReturnKeyType)field.GetValue(null);
    }
    }
    throw new NotSupportedException($"Not supported on iOS: {value}");
    }
    }
    }

    Android自定义 EntryRenderer:

    [assembly: ExportRenderer(typeof(Entry), typeof(EntryExtRenderer_Droid))]
    namespace KeyboardDone.Droid
    {
    public class EntryExtRenderer_Droid : EntryRenderer
    {
    public EntryExtRenderer_Droid() { }

    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
    base.OnElementChanged(e);
    if ((Control != null) && (e.NewElement != null))
    {
    var entryExt = (e.NewElement as EntryExt);
    Control.ImeOptions = entryExt.ReturnKeyType.GetValueFromDescription();
    // This is hackie ;-) / A Android-only bindable property should be added to the EntryExt class
    Control.SetImeActionLabel(entryExt.ReturnKeyType.ToString(), Control.ImeOptions);
    }
    }
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
    base.OnElementPropertyChanged(sender, e);
    if (e.PropertyName == EntryExt.ReturnKeyPropertyName)
    {
    var entryExt = (sender as EntryExt);
    Control.ImeOptions = entryExt.ReturnKeyType.GetValueFromDescription();
    // This is hackie ;-) / A Android-only bindable property should be added to the EntryExt class
    Control.SetImeActionLabel(entryExt.ReturnKeyType.ToString(), Control.ImeOptions);
    }
    }

    }
    public static class EnumExtensions
    {
    public static ImeAction GetValueFromDescription(this ReturnKeyTypes value)
    {
    var type = typeof(ImeAction);
    if (!type.IsEnum) throw new InvalidOperationException();
    foreach (var field in type.GetFields())
    {
    var attribute = Attribute.GetCustomAttribute(field,
    typeof(DescriptionAttribute)) as DescriptionAttribute;
    if (attribute != null)
    {
    if (attribute.Description == value.ToString())
    return (ImeAction)field.GetValue(null);
    }
    else
    {
    if (field.Name == value.ToString())
    return (ImeAction)field.GetValue(null);
    }
    }
    throw new NotSupportedException($"Not supported on Android: {value}");
    }
    }
    }

    关于xamarin - 在Xamarin Forms Shared Project中将return更改为next/done键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37445473/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com