繁体   English   中英

键盘使用Xamarin Forms快速隐藏并重新出现在Android上

[英]Keyboard quickly hides and reappears on Android using Xamarin Forms

我们正在尝试使用Xamarin Forms构建一个聊天应用程序,但我们一直在使用Android键盘来解决这个烦人的错误。 每当点击“发送”按钮时,对条目(用于聊天的文本框)的焦点将丢失,键盘将消失。 这不是我们想要的,所以我们将这一行添加到TapGestureRecognizer中:

messageEntry.Focus();

但由于某种原因,这种情况发生的速度不够快,通常键盘会下降并立即再次上升。 这可以防止用户按顺序快速发布多条消息。 有人知道如何解决这个问题吗?

感谢@AdamKemp在这篇文章中给出的回答,这是我的解决方案。 如果触摸在我的EntryStackLayout (不要忘记创建空的自定义渲染器),那么我不会忽略键盘(如果CurrentFocusEditText DispatchTouchEvent将执行CurrentFocus操作)。

public class EditorAndButtonReproPage : ContentPage
    {
        public EditorAndButtonReproPage()
        {
            BackgroundColor = Color.Gray;
            Padding = 50;
            var editor = new Editor {HorizontalOptions = LayoutOptions.FillAndExpand};
            var editorButton = new Button {Text = "OK", HorizontalOptions = LayoutOptions.End};
            var editorLayout = new EntryStackLayout { Orientation = StackOrientation.Horizontal, Children = { editor, editorButton}, VerticalOptions = LayoutOptions.Start};
            var entry = new ExtendedEntry { Placeholder = "Entry", HorizontalOptions = LayoutOptions.FillAndExpand };
            var entryButton = new Button { Text = "OK", HorizontalOptions = LayoutOptions.End };
            var entryLayout = new EntryStackLayout { Orientation = StackOrientation.Horizontal, Children = { entry, entryButton }, VerticalOptions = LayoutOptions.Start };
            Content = new StackLayout {Children = {editorLayout, entryLayout}};
        }
    }

并在MainActivity

private bool _ignoreNewFocus;
        public override bool DispatchTouchEvent(MotionEvent e)
        {
            var currentView = CurrentFocus;
            var parent = currentView?.Parent?.Parent;
            var entryStackLayout = parent as EntryStackLayout;
            if (entryStackLayout != null)
            {
                var entryLayoutLocation = new int[2];
                entryStackLayout.GetLocationOnScreen(entryLayoutLocation);
                var x = e.RawX + entryStackLayout.Left - entryLayoutLocation[0];
                var y = e.RawY + entryStackLayout.Top - entryLayoutLocation[1];
                var entryStackLayoutRect = new Rectangle(entryStackLayout.Left, entryStackLayout.Top, entryStackLayout.Width, entryStackLayout.Height);
                _ignoreNewFocus = entryStackLayoutRect.Contains(x, y);
            }
            var result = base.DispatchTouchEvent(e);
            _ignoreNewFocus = false;
            return result;
        }

        public override Android.Views.View CurrentFocus => _ignoreNewFocus ? null : base.CurrentFocus;

这有点像黑客,但你可以分离出等待50ms的异步任务,然后在主UI线程上调用messageEntry.Focus()行...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM