我正在编写Xamarin Forms应用程序(.net标准2.0)。目前,它仅针对Android开发,但将来可能会发布给其他操作系统。我要管理的方案是这样的:
我通过在自定义渲染器中使用本机Android代码来赋予Entry焦点:
if (e.NewElement != null && e.NewElement is CustomEntry)
{
CustomEntry customEntry = (CustomEntry)e.NewElement;
if(customEntry.GiveFocus)
{
//this messes up the onback behaviour - you have to press onback twice to exit the screen, once to get out of the hidden SIP
Control.RequestFocus();
}
}
我不希望软键盘自动弹出。因此,我将以下行添加到MainActivity的OnCreate中:
Window.SetSoftInputMode(SoftInput.StateAlwaysHidden);
我请求在自定义渲染器而不是Xamarin Forms条目中聚焦的原因是,我可以看到键盘弹出窗口,然后在Xamarin Forms控件中请求它时立即消失。我不希望键盘出现,因为该应用程序将主要用于带有硬件键盘的工业设备的用户,但是由于用户希望立即在其中输入文本,因此该条目需要重点关注。
我的问题是在这种情况下用户必须按两次返回按钮才能退出ContentPage。一次退出隐藏的键盘(Entry失去焦点),然后再次退出页面。我要避免这种情况-隐藏键盘后,他们只需单击一下就能退出页面。有谁知道如何解决这个问题?我已经尝试过在自定义渲染器中覆盖OnKeyPreIme,如其他答案所建议的那样,但是它似乎无法检测到后退点击。
答案 0 :(得分:0)
您可以在输入焦点时使用“隐藏键盘”方法。它可能解决了您的问题。
public interface IKeyboardHelper
{
void HideKeyboard();
}
对于Android使用:
public class DroidKeyboardHelper : IKeyboardHelper
{
public void HideKeyboard()
{
var context = Forms.Context;
var inputMethodManager = context.GetSystemService(Context.InputMethodService) as InputMethodManager;
if (inputMethodManager != null && context is Activity)
{
var activity = context as Activity;
var token = activity.CurrentFocus?.WindowToken;
inputMethodManager.HideSoftInputFromWindow(token, HideSoftInputFlags.None);
activity.Window.DecorView.ClearFocus();
}
}
}
对于iOS:
public class iOSKeyboardHelper : IKeyboardHelper
{
public void HideKeyboard()
{
UIApplication.SharedApplication.KeyWindow.EndEditing(true);
}
}
使用Dependency Injection
并在输入内容集中时调用此方法。
尝试使用以下方法处理后退按钮按下事件。
protected override bool OnBackButtonPressed()
{
// you can handle back button pressed event in Xamarin forms page
return base.OnBackButtonPressed();
}
答案 1 :(得分:0)
我(终于)解决了。关键不是要覆盖OnKeyPreIME,而是要覆盖DispatchKeyEventPreIme。这使您可以拦截“后退”新闻。因此,在我的CustomRenderer中,我添加了以下方法:
public override bool DispatchKeyEventPreIme(KeyEvent e)
{
//if this is back press and the sip is not visible then we need to call the 'OnBack' method at the view model level
if(!SIPVisibleListener.IsSIPVisible && e.KeyCode == Keycode.Back)
{
if(XamarinFormsControl != null && XamarinFormsControl is IOnBackHandler)
{
((IOnBackHandler)XamarinFormsControl).GoBack();
}
}
return base.DispatchKeyEventPreIme(e);
}
IOnBackHandler是我创建的用于处理后退按键的接口。 SIPVisibleListener基于以下问题的答案:How do I Detect if Software Keyboard is Visible on Android Device? 希望这会对某人有所帮助。