Xamarin表格检查键盘是否打开

时间:2017-09-22 08:31:45

标签: xamarin.forms xamarin.android keyboard-events

有没有办法在Xamarin Forms中检查键盘是否打开?键盘打开或关闭时是否有任何事件被触发?如果是这样,我在哪里可以找到它的一个例子?

2 个答案:

答案 0 :(得分:8)

我不相信有Xamarin.Forms方式可以做到这一点。无论如何,对于不同的平台(至少是Android和iOS),有一种方法可以达到你想要的效果。

的Android

在android下有InputMethodManager类。您可以从活动中获取

var inputMethodManager = (InputMethodManager)this.GetSystemService(Context.InputMethodService);

现在您可以检查键盘是否显示

var keyboardIsShown = inputMethodManager.IsAcceptingText;

根据this article on CodeProject,您可以使用从IOnGlobalLayoutListener派生的类来收听全局布局事件。触发此事件后,如果由于键盘弹出而更改了布局,则可以使用上面的代码进行检查。

的iOS

在iOS下,您可以使用UIKeyboard课程,以便观察DidShowNotification(请参阅here)。

notification = UIKeyboard.Notifications.ObserveDidShow ((sender, args) => {
    Debug.WriteLine("Keyboard is shown.");
    // whatever
});

同样,您可以观察DidHideNotification(以及其他一些人 - 请参阅here)。

Xamarin.Forms

要在Xamarin.Forms中实现键盘通知,最简单的方法是实现使用DependencyService解析的平台依赖关系。为此,您首先必须为平台服务引入一个接口。

public interface IKeyboardService
{
  event EventHandler KeyboardIsShown;
  event EventHandler KeyboardIsHidden;
}

在特定于平台的项目中,您必须以特定于平台的方式实现功能。请参阅以下代码部分以了解iOS实现

[assembly: Xamarin.Forms.Dependency(typeof(Your.iOS.Namespace.KeyboardService))]

namespace Your.iOS.Namespace
{
  public class KeyboardService : IKeyboardService
  {
    public event EventHandler KeyboardIsShown;
    public event EventHandler KeyboardIsHidden;

    public KeyboardService()
    {
      SubscribeEvents();
    }

    private void SubscribeEvents()
    {
      UIKeyboard.Notifications.ObserveDidShow(OnKeyboardDidShow);
      UIKeyboard.Notifications.ObserveDidHode(OnKeyboardDidHide);
    }

    private void OnKeyboardDidShow(object sender, EventArgs e)
    {
      KeyboardIsShown?.Invoke(this, EventArgs.Empty);
    }

    private void OnKeyboardDidHide(object sender, EventArgs e)
    {
      KeyboardIsHidden?.Invoke(this, EventArgs.Empty);
    }
  }
}

Xamarin.Forms.Dependency使该类对DependencyService可见。请参阅以下Android实施代码

[assembly: Xamarin.Forms.Dependency(typeof(Your.Android.Namespace.KeyboardService))]

namespace Your.Android.Namespace
{
  public class KeyboardService : IKeyboardService, ViewTreeObserver.IOnGlobalLayoutListener
  {
    public event EventHandler KeyboardIsShown;
    public event EventHandler KeyboardIsHidden;

    private InputMethodManager inputMethodManager;

    private bool wasShown = false;

    public KeyboardService()
    {
      GetInputMethodManager();
      SubscribeEvents();
    }

    public void OnGlobalLayout()
    {
      GetInputMethodManager();
      if(!wasShown && IsCurrentlyShown())
      {
        KeyboardIsShown?.Invoke(this, EventArgs.Empty);
        wasShown = true;
      }
      else if(wasShown && !IsCurrentlyShown())
      {
        KeyboardIsHidden?.Invoke(this, EventArgs.Empty);
        wasShown = false;
      }
    }

    private void IsCurrentlyShown()
    {
      return inputMethodManager.IsAcceptingText;
    }

    private void GetInputMethodManager()
    {
      if (inputMethodManager == null || inputMethodManager.Handle == IntPtr.Zero)
      {
        inputMethodManager = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
      }
    }

    private void SubscribeEvents()
    {
      ((Activity)Xamarin.Forms.Forms.Context).Window.DecorView.ViewTreeObserver.AddOnGlobalLayoutListener(this);
    }
  }
}

在您的Xamarin.Forms应用中,您现在可以使用

获取IKeyboardService的正确实现的实例
var keyboardService = Xamarin.Forms.DependencyService.Get<IKeyboardService>();  

答案 1 :(得分:0)

在Xamarin表单中,ANDROID代码已更改

(InputMethodManager)this.GetSystemService(Context.InputMethodService);

使用

 (InputMethodManager)Xamarin.Forms.Forms.Context.GetSystemService(Context.InputMethodService);