Xamarin表格检查键盘是否打开

Deb*_*ish 5 keyboard-events xamarin.android xamarin.forms

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

Pau*_*her 9

我不相信有Xamarin.Forms办法做到这一点.无论如何,对于不同的平台(至少Android和iOS),有一种方法可以实现您想要的.

Android的

在android下有InputMethodManager课.您可以从您的活动中获取它

var inputMethodManager = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
Run Code Online (Sandbox Code Playgroud)

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

var keyboardIsShown = inputMethodManager.IsAcceptingText;
Run Code Online (Sandbox Code Playgroud)

根据CodeProject上的这篇文章,您可以使用派生自的类IOnGlobalLayoutListener来监听全局布局事件.触发此事件时,如果由于键盘弹出而更改了布局,则可以使用上面的代码进行检查.

iOS版

在iOS下,您可以使用UIKeyboard允许您观察的类DidShowNotification(请参阅此处).

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

同样你可以观察DidHideNotification(和其他一些 - 见这里).

Xamarin.Forms

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

public interface IKeyboardService
{
  event EventHandler KeyboardIsShown;
  event EventHandler KeyboardIsHidden;
}
Run Code Online (Sandbox Code Playgroud)

在特定于平台的项目中,您必须以特定于平台的方式实现功能.有关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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在您的应用程式Xamarin.Forms你现在可以得到正确实施的实例IKeyboardService

var keyboardService = Xamarin.Forms.DependencyService.Get<IKeyboardService>();  
Run Code Online (Sandbox Code Playgroud)

  • 我在这一行有问题 (InputMethodManager)this.GetSystemService(Context.InputMethodService); (2认同)