Xamarin.Forms. Android. Не могу спрятать клавиатуру - PullRequest
1 голос
/ 24 марта 2020

Когда мой элемент управления Entry получает фокус, появляется виртуальная клавиатура. Мне нужно скрыть клавиатуру и показывать ее только тогда, когда пользователь явно звонит. Я пытался использовать InputMethodManager, чтобы скрыть клавиатуру, но после вызова метода HideSoftInputFromWindow(...) клавиатура все еще остается на экране. ToggleSoftInputFromWindow(...) метод также не работает.

. NET Стандартный проект:

public partial class App : Application
{
    public IKeyboardService KeyboardService { get; set; }

    public App()
    {
        InitializeComponent();
        MainPage = new MainPage( new MainViewModel() );
    }
}

public partial class CustomEntry
{
    public CustomEntry()
    {
        InitializeComponent();
        Focused += OnCustomEntryFocused;
    }

    private void OnCustomEntryFocused( object sender, FocusEventArgs e )
    {
        ( (App)App.Current ).KeyboardService.HideKeyboard();
    }
}

public interface IKeyboardService
{
    void HideKeyboard();
}

Android проект:

public class KeyboardService : IKeyboardService
{
    public void HideKeyboard()
    {
        var activity = MainActivity.Instance;
        var imm = activity.GetSystemService( Context.InputMethodService ) as InputMethodManager;
        if ( imm != null )
        {
            var token = activity.CurrentFocus?.WindowToken;
            imm.HideSoftInputFromWindow( token, HideSoftInputFlags.NotAlways );
            //imm.ToggleSoftInputFromWindow( token, ShowSoftInputFlags.None, HideSoftInputFlags.NotAlways );
        }
    }
}

Как скрыть клавиатуру ?

Ответы [ 3 ]

0 голосов
/ 25 марта 2020

Один метод, как сказал выше Брэндон Минник, используйте свойство IsEnable, чтобы отключить его фокус.

вот еще один метод, который вы должны создать в вашем проекте Android: «1004»:

[assembly: ExportRenderer(typeof(CustomEntry), typeof(MyEntryRenderer))]
namespace EntryCa.Droid
{
  class MyEntryRenderer:EntryRenderer
  {
    public MyEntryRenderer(Context context) : base(context)
    {

    }
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (Control != null)
        {
            // do whatever you want to the UITextField here!
            Control.InputType = Android.Text.InputTypes.Null;
        }
    }
  }
}

затем в вашем проекте PL C:

public partial class CustomEntry :Entry
{

}

на вашей странице. Xaml:

<local:CustomEntry Placeholder="hi" ></local:CustomEntry>

вы увидите, когда подадите заявку, не выскочит клавиатура.

0 голосов
/ 25 марта 2020

Если вы хотите скрыть клавиатуру при запуске занятия , добавьте в свою деятельность следующее:

WindowSoftInputMode = Android .Views.SoftInput.StateAlwaysHidden

[Activity(Label = "MainActivity", WindowSoftInputMode = Android.Views.SoftInput.StateAlwaysHidden)]

    public class MainActivity : Activity
    {  }

Чтобы скрыть клавиатуру программно, используйте эту функцию:

private void DismissKeyboard()
        {
            var view = CurrentFocus;
            if (view != null)
            {
                var imm = (InputMethodManager)GetSystemService(InputMethodService);
                imm.HideSoftInputFromWindow(view.WindowToken, 0);
            }
        }

Или эту функцию:

private void DismissKeyboard2()
        {
            var currentFocus = this.CurrentFocus;
            if (currentFocus != null)
            {
                InputMethodManager inputMethodManager = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
                inputMethodManager.HideSoftInputFromWindow(currentFocus.WindowToken, HideSoftInputFlags.None);
            }

        }

Или используйте тему вместе как:

myEditText.FocusChange += (object sender, View.FocusChangeEventArgs e) =>
            {

                DismissKeyboard();
                DismissKeyboard2();
            };
0 голосов
/ 25 марта 2020

Вы можете скрыть клавиатуру программно в Xamarin.Forms, переключив IsEnabled на Entry

public class CustomEntry
{
    public CustomEntry()
    {
        InitializeComponent();
        Focused += OnCustomEntryFocused;
    }

    private void OnCustomEntryFocused(object sender, FocusEventArgs e)   
    {
        var entry = (Entry)sender;

        entry.IsEnabled = false;
        entry.IsEnabled = true;
    }
}

...