Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change return to be next/done key in Xamarin Forms Shared Project

Is it possible to change the text in the 'return' key on the keyboard to be either 'next' or 'done'? I have a login form with username and password. I want the return key to say 'next' when on the username field and then 'done' when on the password field but haven't seen anyway of doing this. This is for a shared project, android and iOS.

Username

Password

like image 777
John Avatar asked May 25 '16 18:05

John


People also ask

What's new in Xamarin forms?

The latest Xamarin Forms package adds the ReturnType attribute for Entry elements. It will also execute a command when the Done button is clicked. The IMEAction types for Done, Next, Search, Go and Send are all supported now.

Does Xamarin forms support imeaction for done button?

The latest Xamarin Forms package adds the ReturnType attribute for Entry elements. It will also execute a command when the Done button is clicked. The IMEAction types for Done, Next, Search, Go and Send are all supported now. Thanks for contributing an answer to Stack Overflow! Please be sure to answer the question.

Is it possible to add returntype in Xamarin forms?

Yes latest Xamarin Forms allowed directly ReturnType as property, just need to add ReturnType in Xaml Show activity on this post. Here is an alternative approach, but similar to the solution of SushiHangover. It includes UWP support:

How to customize the entry control in Xamarin forms?

You now have a basic Xamarin.Forms app. Click the "Play" button to try it out. Now, create an Inherit class form Entry for customizing the Entry control. Now, write the following code. In this step, create an inherit Class form, EntryRenderer for customizing the Entry control.


1 Answers

A custom EntryRenderer can handle changing the keyboard return key description.

  • iOS : UITextField has a ReturnKeyType property that you can set to a preassigned list (see UIReturnType enum).

  • Android : EntryEditText has a ImeOptions property that controls what the "Action" button on the keyboard does and a SetImeActionLabel method that you can use to set any text string for it.

enter image description here

Usage Example of the custom Entry/EntryRenderer:

new EntryExt {     Text = "Next Key",     ReturnKeyType = ReturnKeyTypes.Next }, new EntryExt {     Text = "Done Key",     ReturnKeyType = ReturnKeyTypes.Done } 

A Xamarin.Forms custom Entry class:

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 custom 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 custom 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}");         }     } } 
like image 55
SushiHangover Avatar answered Sep 21 '22 21:09

SushiHangover