我正在处理Xamarin Forms项目,并且正在使用Entry视图,这是必需的,因为我需要能够专注于它,但是这也要求不显示软键盘。
此要求无法更改。另外,我无法使用“标签”或“按钮”代替“输入”,因为它们没有获得焦点。
在这篇文章(https://theconfuzedsourcecode.wordpress.com/2017/05/19/a-keyboard-disabled-entry-control-in-xamarin-forms/comment-page-1/#comment-1300)之后,我尝试创建自定义渲染器并在Android上使用ShowSoftInputOnFocus,但这会短暂显示,然后隐藏软键盘。这不是一个选择,因为我的要求是严格禁止在此自定义输入字段上完全不显示软键盘。
因此,我在Xamarin.Forms项目(.NET Standard 2.0)中创建了自定义KeyboardlessEntry
:
namespace MyProjNamespace
{
public class KeyboardlessEntry : Entry
{
}
}
,然后是Xamarin.Droid head项目中的自定义KeyboardlessEntryRenderer
渲染器,如下所示:
[assembly: ExportRenderer(typeof(KeyboardlessEntry), typeof(KeyboardlessEntryRenderer))]
namespace MyProjNamespace.Droid
{
public class KeyboardlessEntryRenderer : EntryRenderer
{
//as of latest Xamarin.Forms need to provide c-tor that
//receives Android Context and sets it in base
public KeyboardlessEntryRenderer (Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (e.NewElement != null)
{
((KeyboardlessEntry)e.NewElement).PropertyChanging += OnPropertyChanging;
}
if (e.OldElement != null)
{
((KeyboardlessEntry)e.OldElement).PropertyChanging -= OnPropertyChanging;
}
this.Control.ShowSoftInputOnFocus = false; // disable soft keyboard on focus
}
private void OnPropertyChanging(object sender, PropertyChangingEventArgs propertyChangingEventArgs)
{
if (propertyChangingEventArgs.PropertyName == VisualElement.IsFocusedProperty.PropertyName)
{
// fully dismiss the soft keyboard
InputMethodManager imm = (InputMethodManager)this.Context.GetSystemService(Context.InputMethodService);
imm.HideSoftInputFromWindow(this.Control.WindowToken, 0);
}
}
}
}
如您所见,我在ShowSoftInputOnFocus
覆盖中设置了OnElementChanged
,但这并不能因为某些原因阻止它显示。我的键盘仍然显示在KeyboardlessEntry
焦点上,然后消失了,因为我在HideSoftInputFromWindow
事件中调用了OnPropertyChanging
。
我不确定为什么这不起作用。我希望像上面一样将ShowSoftInputOnFocus
设置为false会完全禁止软键盘显示。有人声称这可以在Android或Xamarin.Android上使用,但在Xamarin.Forms中不可用。
iOS上的类似问题,这是iOS的渲染器
[程序集:ExportRenderer(typeof(KeyboardlessEntry),typeof(KeyboardlessEntryRenderer))] 命名空间Squirrel.FoH.App.iOS.Implementations.Controls { 公共类KeyboardlessEntryRenderer:EntryRenderer { 公共KeyboardlessEntryRenderer() { }
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
this.Control.InputView = new UIView(); // disable soft keyboard
}
}
}
这也会显示,然后将键盘缩小至下方,但请注意,没有按钮可以完全将其关闭,从而更加烦人
答案 0 :(得分:0)
尝试将其添加到您的KeyboardlessEntryRenderer
类中:
public KeyboardlessEntryRenderer (Context context) : base(context)
{
}