Закрыть / скрыть мягкую клавиатуру Android в MvxFragment

Я создаю android-приложение с xamarin + mvvmcross. У меня есть MvxAutoCompleteTextView в моем MvxFragment. После записи в MvxAutoCompleteTextView и нажатия на другие элементы управления, я хочу скрыть виртуальную клавиатуру. Я использую этот код

public class MyFragment : MvxFragment 
{
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState)
    {

        base.OnCreateView(inflater, container, savedInstanceState);
        var view = this.BindingInflate(Resource.Layout.frMy, null);
        var autoComplete = view.FindViewById<MvxAutoCompleteTextView>(Resource.Id.acMy);
        InputMethodManager inputManager = (InputMethodManager)inflater.Context.GetSystemService(Context.InputMethodService);
        inputManager.HideSoftInputFromWindow(autoComplete.WindowToken, HideSoftInputFlags.None);
        return view;
    }
}

но это не работает. Как скрыть клавиатуру?

4 ответов


попробуйте это:

InputMethodManager imm = (InputMethodManager)GetSystemService(Context.InputMethodService);
imm.HideSoftInputFromWindow(autoComplete.WindowToken, 0);

значение 0 на HideSoftInputFromWindow является const Android.Views.InputMethods.HideSoftInputFlags.None таким образом, вы можете использовать эквивалентный синтаксис:

InputMethodManager imm = (InputMethodManager)GetSystemService(Context.InputMethodService);
imm.HideSoftInputFromWindow(autoComplete.WindowToken, Android.Views.InputMethods.HideSoftInputFlags.None);

вы можете скрыть мягкую клавиатуру, придающую фокус чему-то, что не является элементом управления "keyboard launcher", например, родительскому контейнеру вашего автозаполнения.

parentContainer = FindViewById<LinearLayout>(Resource.Id.parentContainer);
parentContainer.RequestFocus();

допустим, ваш родительский контейнер является LinearLayout, вы должны позволить ему получить фокус с этими 2 свойствами:

<LinearLayout
    android:id="@+id/parentContainer"
    android:focusable="true"
    android:focusableInTouchMode="true">

Я получил ответ на java отсюда:https://stackoverflow.com/a/28939113/4664754

вот версия C# (протестирована и работает):

public override bool DispatchTouchEvent(MotionEvent ev)
{
    if (ev.Action == MotionEventActions.Down)
    {
        View v = CurrentFocus;
        if (v.GetType() == typeof(EditText))
        {
            Rect outRect = new Rect();
            v.GetGlobalVisibleRect(outRect);
            if (!outRect.Contains((int)ev.RawX, (int)ev.RawY))
            {
                v.ClearFocus();
                InputMethodManager imm = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
                imm.HideSoftInputFromWindow(v.WindowToken, 0);
            }
        }
    }
    return base.DispatchTouchEvent(ev);
}

этот фрагмент кода скроет мягкую клавиатуру, Если вы нажмете на что-либо, что не является EditText. Вам просто нужно вставить это в свой класс активности (например, ваш loginActivity)


попробуй мою функцию:

public static void Close_AndroidKeyboard(Activity context){
    InputMethodManager inputManager = (InputMethodManager) context.getSystemService(
            Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(),
            InputMethodManager.HIDE_NOT_ALWAYS);
}

Извините, но я работаю с Android studio, скажите мне, если я помог вам и хорошее Программирование!