Fix [Android] Can not set Entry cursor position by tapping if ClearButtonVisibility...
authormelimion <33512073+melimion@users.noreply.github.com>
Thu, 21 Nov 2019 15:22:40 +0000 (18:22 +0300)
committerShane Neuville <shneuvil@microsoft.com>
Thu, 21 Nov 2019 15:22:40 +0000 (08:22 -0700)
* repro

* fix

* set _clearBtn to null in Dispose

* comment removed

Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7773.cs [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
Xamarin.Forms.Platform.Android/Renderers/EntryRenderer.cs

diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7773.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7773.cs
new file mode 100644 (file)
index 0000000..6401197
--- /dev/null
@@ -0,0 +1,34 @@
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+       [Preserve(AllMembers = true)]
+       [Issue(IssueTracker.Github, 7773, "[Android] Can not set Entry cursor position by tapping if ClearButtonVisibility=WhenEditing", PlatformAffected.Android)]
+       public class Issue7773 : TestContentPage
+       {
+               protected override void Init()
+               {
+                       var stack = new StackLayout
+                       {
+                               Children = {
+                                       new Entry
+                                       {
+                        Margin = new Thickness(50),
+                                               HorizontalOptions = LayoutOptions.FillAndExpand,
+                                               ClearButtonVisibility = ClearButtonVisibility.WhileEditing,
+                                               Text = "ClearButtonVisibility"
+                                       },
+                                       new Entry
+                                       {
+                                               HorizontalOptions = LayoutOptions.FillAndExpand,
+                                               ClearButtonVisibility = ClearButtonVisibility.WhileEditing,
+                                               Text = "ClearButtonVisibility2"
+                                       },
+                               }
+                       };
+
+                       Content = stack;
+               }
+       }
+}
\ No newline at end of file
index 1ab2bfb..c002b24 100644 (file)
@@ -21,6 +21,7 @@
     <Compile Include="$(MSBuildThisFileDirectory)CollectionViewHeaderFooterView.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)CollectionViewItemsUpdatingScrollMode.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue8177.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Issue7773.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue8186.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue3475.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue5354.xaml.cs">
index e2a1db5..a441640 100644 (file)
@@ -214,6 +214,7 @@ namespace Xamarin.Forms.Platform.Android
                                        formsEditContext.SelectionChanged -= SelectionChanged;
                                        ListenForCloseBtnTouch(false);
                                }
+                               _clearBtn = null;
                        }
 
                        base.Dispose(disposing);
@@ -530,6 +531,7 @@ namespace Xamarin.Forms.Platform.Android
        // Entry clear button management
        public abstract partial class EntryRendererBase<TControl>
        {
+               Drawable _clearBtn;
                internal override void OnNativeFocusChanged(bool hasFocus)
                {
                        base.OnNativeFocusChanged(hasFocus);
@@ -544,9 +546,24 @@ namespace Xamarin.Forms.Platform.Android
 
                void EditTextTouched(object sender, TouchEventArgs e)
                {
-                       MotionEvent me = e.Event;
-                       if (me.Action == MotionEventActions.Up && me.RawX >= EditText.Right - EditText.CompoundPaddingRight)
-                               EditText.Text = null;
+                       e.Handled = false;
+                       var me = e.Event;
+
+                       var rBounds = _clearBtn?.Bounds;
+                       if (rBounds != null)
+                       {
+                               var x = me.GetX();
+                               var y = me.GetY();
+                               if (me.Action == MotionEventActions.Up
+                                   && x >= (EditText.Right - rBounds.Width())
+                                   && x <= (EditText.Right - EditText.PaddingRight)
+                                   && y >= EditText.PaddingTop
+                                   && y <= (EditText.Height - EditText.PaddingBottom))
+                               {
+                                       EditText.Text = null;
+                                       e.Handled = true;
+                               }
+                       }
                }
 
                void UpdateClearBtnOnElementChanged()
@@ -591,6 +608,7 @@ namespace Xamarin.Forms.Platform.Android
                {
                        Drawable d = showClearButton && (Element.Text?.Length > 0) ? GetCloseButtonDrawable() : null;
                        EditText.SetCompoundDrawablesWithIntrinsicBounds(null, null, d, null);
+                       _clearBtn = d;
                }
 
                protected virtual Drawable GetCloseButtonDrawable()