Deb*_*ish 5 keyboard-events xamarin.android xamarin.forms
有没有办法检查Xamarin Forms中的键盘是否打开?键盘打开或关闭时是否有任何事件被触发?如果是这样,我在哪里可以找到它的一个例子?
我不相信有Xamarin.Forms办法做到这一点.无论如何,对于不同的平台(至少Android和iOS),有一种方法可以实现您想要的.
在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下,您可以使用UIKeyboard允许您观察的类DidShowNotification(请参阅此处).
notification = UIKeyboard.Notifications.ObserveDidShow ((sender, args) => {
Debug.WriteLine("Keyboard is shown.");
// whatever
});
Run Code Online (Sandbox Code Playgroud)
同样你可以观察DidHideNotification(和其他一些 - 见这里).
要在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)
| 归档时间: |
|
| 查看次数: |
4732 次 |
| 最近记录: |