diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3555.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3555.cs
new file mode 100644
index 000000000..5ff37e7bc
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue3555.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Github, 3555, "[Enhancement] Editor: Control over text-prediction", PlatformAffected.All)]
+ public class Issue3555
+ : TestContentPage
+ {
+ protected override void Init()
+ {
+ var editorDefaults = new Editor();
+ var editorFull = new Editor();
+ editorFull.Keyboard = Keyboard.Create(KeyboardFlags.All);
+ var editorNoTextPrediction = new Editor { IsTextPredictionEnabled = false };
+ // IsTextPredictionEnabled should be ignored for email in Editor
+ var editorEmail = new Editor { Text = "moses@example.com", Keyboard = Keyboard.Email, IsTextPredictionEnabled = true };
+ // IsTextPredictionEnabled should be ignored for numeric Editor
+ var editorNumeric = new Editor { Text = "01234", Keyboard = Keyboard.Numeric, IsTextPredictionEnabled = true };
+ // On Android disabling either spell checking or text prediction both turn off text suggestions so this Editor
+ // should behave the same as editorNoTextPrediction above
+ var editorNoSpellChecking = new Editor { IsSpellCheckEnabled = false };
+ var stackLayout = new StackLayout();
+ stackLayout.Children.Add(new Label { Text = "Defaults" });
+ stackLayout.Children.Add(editorDefaults);
+ stackLayout.Children.Add(new Label { Text = "Text prediction disabled" });
+ stackLayout.Children.Add(editorNoTextPrediction);
+ stackLayout.Children.Add(new Label { Text = "Spell checking disabled" });
+ stackLayout.Children.Add(editorNoSpellChecking);
+ stackLayout.Children.Add(new Label { Text = "Email" });
+ stackLayout.Children.Add(editorEmail);
+ stackLayout.Children.Add(new Label { Text = "Numeric" });
+ stackLayout.Children.Add(editorNumeric);
+ stackLayout.Children.Add(new Label { Text = "Full" });
+ stackLayout.Children.Add(editorFull);
+ stackLayout.Padding = new Thickness(0, 20, 0, 0);
+ Content = stackLayout;
+ }
+ }
+}
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
index d969e54ae..43cc9e563 100644
--- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
@@ -20,6 +20,7 @@
+
diff --git a/Xamarin.Forms.Core/Editor.cs b/Xamarin.Forms.Core/Editor.cs
index ba8d12ddf..6ddf34bcc 100644
--- a/Xamarin.Forms.Core/Editor.cs
+++ b/Xamarin.Forms.Core/Editor.cs
@@ -23,6 +23,8 @@ namespace Xamarin.Forms
public static readonly BindableProperty PlaceholderColorProperty = PlaceholderElement.PlaceholderColorProperty;
+ public static readonly BindableProperty IsTextPredictionEnabledProperty = BindableProperty.Create(nameof(IsTextPredictionEnabled), typeof(bool), typeof(Editor), true, BindingMode.Default);
+
public static readonly BindableProperty AutoSizeProperty = BindableProperty.Create(nameof(AutoSize), typeof(EditorAutoSizeOption), typeof(Editor), defaultValue: EditorAutoSizeOption.Disabled, propertyChanged: (bindable, oldValue, newValue)
=> ((Editor)bindable)?.InvalidateMeasure());
@@ -62,6 +64,12 @@ namespace Xamarin.Forms
set { SetValue(FontAttributesProperty, value); }
}
+ public bool IsTextPredictionEnabled
+ {
+ get { return (bool)GetValue(IsTextPredictionEnabledProperty); }
+ set { SetValue(IsTextPredictionEnabledProperty, value); }
+ }
+
public string FontFamily
{
get { return (string)GetValue(FontFamilyProperty); }
diff --git a/Xamarin.Forms.Platform.Android/Renderers/EditorRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/EditorRenderer.cs
index fefcbc613..f72ef694c 100644
--- a/Xamarin.Forms.Platform.Android/Renderers/EditorRenderer.cs
+++ b/Xamarin.Forms.Platform.Android/Renderers/EditorRenderer.cs
@@ -100,6 +100,8 @@ namespace Xamarin.Forms.Platform.Android
UpdateInputType();
else if (e.PropertyName == InputView.IsSpellCheckEnabledProperty.PropertyName)
UpdateInputType();
+ else if (e.PropertyName == Editor.IsTextPredictionEnabledProperty.PropertyName)
+ UpdateInputType();
else if (e.PropertyName == Editor.TextColorProperty.PropertyName)
UpdateTextColor();
else if (e.PropertyName == Editor.FontAttributesProperty.PropertyName)
@@ -165,12 +167,17 @@ namespace Xamarin.Forms.Platform.Android
var keyboard = model.Keyboard;
edit.InputType = keyboard.ToInputType() | InputTypes.TextFlagMultiLine;
- if (!(keyboard is Internals.CustomKeyboard) && model.IsSet(InputView.IsSpellCheckEnabledProperty))
+ if (!(keyboard is Internals.CustomKeyboard))
{
- if ((edit.InputType & InputTypes.TextFlagNoSuggestions) != InputTypes.TextFlagNoSuggestions)
+ if (model.IsSet(InputView.IsSpellCheckEnabledProperty))
{
if (!model.IsSpellCheckEnabled)
- edit.InputType = edit.InputType | InputTypes.TextFlagNoSuggestions;
+ edit.InputType = edit.InputType | InputTypes.TextFlagNoSuggestions;
+ }
+ if (model.IsSet(Editor.IsTextPredictionEnabledProperty))
+ {
+ if (!model.IsTextPredictionEnabled)
+ edit.InputType = edit.InputType | InputTypes.TextFlagNoSuggestions;
}
}
diff --git a/Xamarin.Forms.Platform.UAP/EditorRenderer.cs b/Xamarin.Forms.Platform.UAP/EditorRenderer.cs
index 09e6b9549..188ae47c7 100644
--- a/Xamarin.Forms.Platform.UAP/EditorRenderer.cs
+++ b/Xamarin.Forms.Platform.UAP/EditorRenderer.cs
@@ -94,6 +94,10 @@ namespace Xamarin.Forms.Platform.UWP
{
UpdateInputScope();
}
+ else if (e.PropertyName == Editor.IsTextPredictionEnabledProperty.PropertyName)
+ {
+ UpdateInputScope();
+ }
else if (e.PropertyName == Editor.FontAttributesProperty.PropertyName)
{
UpdateFont();
@@ -282,7 +286,10 @@ namespace Xamarin.Forms.Platform.UWP
}
else
{
- Control.ClearValue(TextBox.IsTextPredictionEnabledProperty);
+ if (editor.IsSet(Editor.IsTextPredictionEnabledProperty))
+ Control.IsTextPredictionEnabled = editor.IsTextPredictionEnabled;
+ else
+ Control.ClearValue(TextBox.IsTextPredictionEnabledProperty);
if (editor.IsSet(InputView.IsSpellCheckEnabledProperty))
Control.IsSpellCheckEnabled = editor.IsSpellCheckEnabled;
else
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs
index b9df27903..465432942 100644
--- a/Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs
+++ b/Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs
@@ -132,6 +132,8 @@ namespace Xamarin.Forms.Platform.iOS
UpdateKeyboard();
else if (e.PropertyName == Xamarin.Forms.InputView.IsSpellCheckEnabledProperty.PropertyName)
UpdateKeyboard();
+ else if (e.PropertyName == Editor.IsTextPredictionEnabledProperty.PropertyName)
+ UpdateKeyboard();
else if (e.PropertyName == VisualElement.IsEnabledProperty.PropertyName)
UpdateEditable();
else if (e.PropertyName == Editor.TextColorProperty.PropertyName)
@@ -202,12 +204,23 @@ namespace Xamarin.Forms.Platform.iOS
void UpdateKeyboard()
{
- Control.ApplyKeyboard(Element.Keyboard);
- if (!(Element.Keyboard is Internals.CustomKeyboard) && Element.IsSet(Xamarin.Forms.InputView.IsSpellCheckEnabledProperty))
+ var keyboard = Element.Keyboard;
+ Control.ApplyKeyboard(keyboard);
+ if (!(keyboard is Internals.CustomKeyboard))
{
- if (!Element.IsSpellCheckEnabled)
+ if (Element.IsSet(Xamarin.Forms.InputView.IsSpellCheckEnabledProperty))
{
- Control.SpellCheckingType = UITextSpellCheckingType.No;
+ if (!Element.IsSpellCheckEnabled)
+ {
+ Control.SpellCheckingType = UITextSpellCheckingType.No;
+ }
+ }
+ if (Element.IsSet(Editor.IsTextPredictionEnabledProperty))
+ {
+ if (!Element.IsTextPredictionEnabled)
+ {
+ Control.AutocorrectionType = UITextAutocorrectionType.No;
+ }
}
}
Control.ReloadInputViews();