有没有办法在Xamarin Forms中检查键盘是否打开?键盘打开或关闭时是否有任何事件被触发?如果是这样,我在哪里可以找到它的一个例子?
答案 0 :(得分:8)
我不相信有Xamarin.Forms
方式可以做到这一点。无论如何,对于不同的平台(至少是Android和iOS),有一种方法可以达到你想要的效果。
在android下有InputMethodManager
类。您可以从活动中获取
var inputMethodManager = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
现在您可以检查键盘是否显示
var keyboardIsShown = inputMethodManager.IsAcceptingText;
根据this article on CodeProject,您可以使用从IOnGlobalLayoutListener
派生的类来收听全局布局事件。触发此事件后,如果由于键盘弹出而更改了布局,则可以使用上面的代码进行检查。
在iOS下,您可以使用UIKeyboard
课程,以便观察DidShowNotification
(请参阅here)。
notification = UIKeyboard.Notifications.ObserveDidShow ((sender, args) => {
Debug.WriteLine("Keyboard is shown.");
// whatever
});
同样,您可以观察DidHideNotification
(以及其他一些人 - 请参阅here)。
要在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);