首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当键盘被隐藏时,Xamarin窗体按后不做任何操作。

当键盘被隐藏时,Xamarin窗体按后不做任何操作。
EN

Stack Overflow用户
提问于 2018-07-25 08:03:24
回答 2查看 982关注 0票数 2

我正在编写一个Xamarin应用程序(.net标准2.0)。目前,它只为Android开发,但将来可能会发布给其他操作系统。我想要处理的情况是:

  • 用户进入带有单个条目的ContentPage
  • 我通过在自定义呈现程序中使用本机Android代码来提供条目焦点: 如果(e.NewElement != null & e.NewElement is CustomEntry) { CustomEntry customEntry = (CustomEntry)e.NewElement;if(customEntry.GiveFocus) {//这会扰乱onback行为-您必须按onback两次才能退出屏幕,一次是为了退出隐藏的SIPControl.RequestFocus();}}
  • 我不希望软键盘自动弹出。因此,我在OnCreate of MainActivity中添加了以下一行: Window.SetSoftInputMode(SoftInput.StateAlwaysHidden);

我在自定义呈现器中请求焦点,而不是在Xamarin窗体条目中请求焦点,原因是我可以看到键盘弹出,然后在Xamarin Forms控件中请求它时立即消失。我不希望键盘出现,因为这个应用程序将主要用于工业设备的用户使用硬件键盘,但该条目将需要有重点,因为用户会想要立即输入文本。

我的问题是,在这个场景中,用户必须按两次后退按钮才能退出ContentPage。一次离开隐藏的键盘(条目失去焦点),然后再次退出页面。我想避免这一点-他们应该能够退出的网页,只有一次点击时,键盘是隐藏的。有人知道怎么解决这个问题吗?正如其他答案所示,我尝试过在自定义呈现器中重写OnKeyPreIme,但它似乎没有检测到回击。

EN

回答 2

Stack Overflow用户

发布于 2018-07-26 05:39:59

当你的条目聚焦时,你可以使用隐藏键盘方法。也许能解决你的问题。

代码语言:javascript
运行
复制
public interface IKeyboardHelper
{
    void HideKeyboard();
}

对于Android的使用:

代码语言:javascript
运行
复制
 public class DroidKeyboardHelper : IKeyboardHelper
{
    public void HideKeyboard()
    {
        var context = Forms.Context;
        var inputMethodManager = context.GetSystemService(Context.InputMethodService) as InputMethodManager;
        if (inputMethodManager != null && context is Activity)
        {
            var activity = context as Activity;
            var token = activity.CurrentFocus?.WindowToken;
            inputMethodManager.HideSoftInputFromWindow(token, HideSoftInputFlags.None);

            activity.Window.DecorView.ClearFocus();
        }
    }
}

对于iOS:

代码语言:javascript
运行
复制
    public class iOSKeyboardHelper : IKeyboardHelper
{
    public void HideKeyboard()
    {
        UIApplication.SharedApplication.KeyWindow.EndEditing(true);
    }
}

使用Dependency Injection并在条目聚焦时调用此方法。

尝试使用下面的方法来处理按下的回按钮事件。

代码语言:javascript
运行
复制
 protected override bool OnBackButtonPressed()
    {          
        // you can handle back button pressed event in Xamarin forms page  
        return base.OnBackButtonPressed();
    }
票数 0
EN

Stack Overflow用户

发布于 2018-09-17 10:49:31

我(终于)想出了办法。关键不是覆盖OnKeyPreIME,而是DispatchKeyEventPreIme。这让你可以拦截‘背面’的新闻。因此,在我的CustomRenderer中,我添加了以下方法:

代码语言:javascript
运行
复制
 public override bool DispatchKeyEventPreIme(KeyEvent e)
    {
        //if this is back press and the sip is not visible then we need to call the 'OnBack' method at the view model level
        if(!SIPVisibleListener.IsSIPVisible && e.KeyCode == Keycode.Back)
        {
           if(XamarinFormsControl != null && XamarinFormsControl is IOnBackHandler)
            {
                ((IOnBackHandler)XamarinFormsControl).GoBack();
            }
        }

        return base.DispatchKeyEventPreIme(e);
    }

IOnBackHandler是我为处理后键按下而创建的一个接口。SIPVisibleListener是基于对这个问题的回答:How do I Detect if Software Keyboard is Visible on Android Device?希望这能帮助到某人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51513794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档