From 11dc5a5aca2842346759022fc405e89d1d0132b1 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 26 Mar 2016 23:29:45 -0700 Subject: [A]Resolve issue where calling Focus in an unfocus event would fail Fixes https://bugzilla.xamarin.com/show_bug.cgi?id=39702 without API change. This does cause android to always indicate a focus event was succesful now because we have no way of knowing ahead of time if it will succeed or fail. That said we always already indicated that unfocus was successful because android has no way of reporting such a failure. --- .../Bugzilla39702.cs | 27 ++++++++++++++++++++++ .../Xamarin.Forms.Controls.Issues.Shared.projitems | 1 + .../AppCompat/NavigationPageRenderer.cs | 2 ++ Xamarin.Forms.Platform.Android/PlatformRenderer.cs | 2 +- Xamarin.Forms.Platform.Android/ViewRenderer.cs | 14 +++++++++-- 5 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39702.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39702.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39702.cs new file mode 100644 index 00000000..8b6bb85a --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39702.cs @@ -0,0 +1,27 @@ +using Xamarin.Forms.CustomAttributes; + +namespace Xamarin.Forms.Controls +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 39702, "Cannot enter text when Entry is focus()'d from an editor completed event")] + public class Bugzilla39702 : TestContentPage // or TestMasterDetailPage, etc ... + { + protected override void Init() + { + Title = "focus test"; + var editor = new Editor(); + var entry = new Entry(); + + editor.Unfocused += (object sender, FocusEventArgs e) => entry.Focus(); + + Content = new StackLayout + { + Children = + { + editor, + entry + } + }; + } + } +} \ No newline at end of file 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 81a6c2e2..75ace128 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 @@ -83,6 +83,7 @@ Bugzilla39463.xaml Code + diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs index 7edbffb2..dd1c033d 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs @@ -625,6 +625,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat }); } + Context.HideKeyboard(this); + // 200ms is how long the animations are, and they are "reversible" in the sense that starting another one slightly before it's done is fine return tcs.Task; diff --git a/Xamarin.Forms.Platform.Android/PlatformRenderer.cs b/Xamarin.Forms.Platform.Android/PlatformRenderer.cs index 4fbc0293..f31b0702 100644 --- a/Xamarin.Forms.Platform.Android/PlatformRenderer.cs +++ b/Xamarin.Forms.Platform.Android/PlatformRenderer.cs @@ -61,7 +61,7 @@ namespace Xamarin.Forms.Platform.Android break; Context.HideKeyboard(currentView); - RequestFocus(); + ((Activity)Context).Window.DecorView.ClearFocus(); } while (false); return result; diff --git a/Xamarin.Forms.Platform.Android/ViewRenderer.cs b/Xamarin.Forms.Platform.Android/ViewRenderer.cs index f5c094ba..0415ce93 100644 --- a/Xamarin.Forms.Platform.Android/ViewRenderer.cs +++ b/Xamarin.Forms.Platform.Android/ViewRenderer.cs @@ -1,6 +1,7 @@ using System; using System.ComponentModel; using Android.App; +using Android.OS; using Android.Views; using AView = Android.Views.View; @@ -149,11 +150,20 @@ namespace Xamarin.Forms.Platform.Android if (Control == null) return; + e.Result = true; + if (e.Focus) - e.Result = Control.RequestFocus(); + { + // use post being BeginInvokeOnMainThread will not delay on android + Looper looper = Context.MainLooper; + var handler = new Handler(looper); + handler.Post(() => + { + Control?.RequestFocus(); + }); + } else { - e.Result = true; Control.ClearFocus(); } -- cgit v1.2.3