Запись Xamarin.Forms, которая не должна показывать SoftKeyboard в фокусе - PullRequest
0 голосов
/ 27 ноября 2018

Я работаю над проектом 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затем переводит клавиатуру в полосу ниже, но учтите, что нет кнопки, чтобы полностью ее закрыть, что делает ее еще более раздражающей

enter image description here

1 Ответ

0 голосов
/ 27 ноября 2018

Попробуйте добавить это в ваш KeyboardlessEntryRenderer класс:

public KeyboardlessEntryRenderer (Context context) : base(context)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...