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 次 |
最近记录: |