summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Smith <jason.smith@xamarin.com>2016-03-26 23:29:45 -0700
committerRui Marinho <me@ruimarinho.net>2016-03-29 18:15:11 +0100
commit11dc5a5aca2842346759022fc405e89d1d0132b1 (patch)
treec587604fc9805b677e94c749788d011a36ce0a41
parent0e03738adefaa1accd733e817d7730f2c9b82534 (diff)
downloadxamarin-forms-11dc5a5aca2842346759022fc405e89d1d0132b1.tar.gz
xamarin-forms-11dc5a5aca2842346759022fc405e89d1d0132b1.tar.bz2
xamarin-forms-11dc5a5aca2842346759022fc405e89d1d0132b1.zip
[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.
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla39702.cs27
-rw-r--r--Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems1
-rw-r--r--Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs2
-rw-r--r--Xamarin.Forms.Platform.Android/PlatformRenderer.cs2
-rw-r--r--Xamarin.Forms.Platform.Android/ViewRenderer.cs14
5 files changed, 43 insertions, 3 deletions
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 @@
<DependentUpon>Bugzilla39463.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
+ <Compile Include="$(MSBuildThisFileDirectory)Bugzilla39702.cs" />
<Compile Include="$(MSBuildThisFileDirectory)CarouselAsync.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla34561.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla34727.cs" />
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();
}