Я работаю над проектом Xamarin Forms и использую представление Entry, и это требование, поскольку мне нужно иметь возможность сосредоточиться на нем, но также необходимо не показывать программную клавиатуру.
Это требование не может быть изменено.Кроме того, я не могу использовать метку или кнопку вместо ввода, поскольку они не получают фокус.
После этой статьи (https://theconfuzedsourcecode.wordpress.com/2017/05/19/a-keyboard-disabled-entry-control-in-xamarin-forms/comment-page-1/#comment-1300), я попытался создать пользовательский рендерер и использовать ShowSoftInputOnFocus на Android, но это будеткратко показать, а затем скрыть программную клавиатуру. Это не вариант, поскольку мое требование строго не отображать программную клавиатуру в этом пользовательском поле ввода вообще.
Итак, я создал свой пользовательский KeyboardlessEntry
в Xamarin.Formsпроект (.NET Standard 2.0):
namespace MyProjNamespace
{
public class KeyboardlessEntry : Entry
{
}
}
, а затем мой пользовательский KeyboardlessEntryRenderer
рендерер в главном проекте Xamarin.Droid, например:
[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, как я делал выше, отключит отображение программной клавиатуры полностью. Некоторые люди утверждают, что это работаетn Android или Xamarin.Android, но он не работает в Xamarin.Forms.
Аналогичная проблема на iOS, вот рендер для iOS
[сборка: ExportRenderer (typeof (KeyboardlessEntry), typeof(KeyboardlessEntryRenderer))] пространство имен Squirrel.FoH.App.iOS.Implementations.Controls {открытый класс KeyboardlessEntryRenderer: EntryRenderer {public KeyboardlessEntryRenderer () {}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
this.Control.InputView = new UIView(); // disable soft keyboard
}
}
}
1035 * *1034* 1035затем переводит клавиатуру в полосу ниже, но учтите, что нет кнопки, чтобы полностью ее закрыть, что делает ее еще более раздражающей