键盘使用Xamarin表单在Android上快速隐藏和重新出现 [英] Keyboard quickly hides and reappears on Android using Xamarin Forms

查看:0
本文介绍了键盘使用Xamarin表单在Android上快速隐藏和重新出现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正试图使用Xamarin表单构建一个聊天应用程序,但我们一直在Android键盘上收到这个令人讨厌的错误。每当点击"发送"按钮时,条目(用于聊天的文本框)上的焦点就会消失,键盘也会消失。这不是我们想要的,因此我们将以下行添加到TapGestureRecognizer:

messageEntry.Focus();

但由于某些原因,这种情况发生得不够快,经常会出现键盘关闭并立即重新打开的情况。这可防止用户快速连续发布多条消息。有人知道如何修复此问题吗?

推荐答案

感谢post中@AdamKemp的回答,以下是我的解决方案。如果触摸在我的EntryStackLayout内(不要忘记创建空的自定义呈现器),则我不会取消键盘(这是CurrentFocusEditTextDispatchTouchEvent将执行的操作)。

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;

这篇关于键盘使用Xamarin表单在Android上快速隐藏和重新出现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆