简体   繁体   English

在任何地方隐藏软键盘

[英]Hide Soft Keyboard from anywhere

Hiding the soft keyboard is pain. 隐藏软键盘很痛苦。 I use some methods based on having an EditText which gets focus, but in my current app the keyboard keeps popping up at some point where a new fragment is loaded. 我使用一些基于具有焦点的EditText的方法,但是在我当前的应用中,键盘会在加载新片段的某个位置不断弹出。

I have a method in my helper class, but it does not work for me: 我的帮助器类中有一个方法,但对我不起作用:

 //Hide keyboard
    public static void hideSoftKeyboard(Activity activity) {
        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }

What I would love is a helper method, I could call from anywhere to hide the soft keyboard. 我想要的是一种辅助方法,我可以从任何地方调用以隐藏软键盘。 Is this possible, or do I always need the find the EditText which is focused? 这是可能的,还是我总是需要找到重点突出的EditText?

Do something like this pass any edittext id of that activity..it will work for that activty 做这样的事情通过该活动的任何edittext id ..它将适用于该活动

public static void hideSoftKeyboard(Activity activity, EditText editText) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService(
                Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }

Try use that code (found it in ru internet segment Habra Habr ) 尝试使用该代码(在ru网络段Habra Habr中找到了它)

public void showSoftInputOnFocusCompat(boolean isShow) {

    showSoftInputOnFocus = isShow;
    if (Build.VERSION.SDK_INT >= 21) {
        setShowSoftInputOnFocus(showSoftInputOnFocus);
    } else {
        try {
            final Method method = EditText.class.getMethod("setShowSoftInputOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(this, showSoftInputOnFocus);
        } catch (Exception e) {
            // ignore
        }
    }
}

In your AndroidManifest.xml: 在您的AndroidManifest.xml中:

<activity android:name="com.your.package.ActivityName"
          android:windowSoftInputMode="stateHidden"  />

This setting will hide soft keyboard when user enters new Activity (even if EditText control gains the focus). 当用户输入新的Activity时,此设置将隐藏软键盘(即使EditText控件获得了焦点)。 Soft keyboard will be shown only when user clicks the edit box control. 仅当用户单击编辑框控件时,才会显示软键盘。

Try with this 试试这个

public static void hideAllKeyboard(Activity activity)
{
    View view = activity.getCurrentFocus();
    if (view != null) {  
        InputMethodManager imm = (InputMethodManager)activity.getSystemService(
                Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
}

use this 用这个

public void hideSoftKeyboard(Activity context) 
{
    InputMethodManager inputMethodManager = (InputMethodManager)  context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(), 0);
}

for me works this method: 对我来说,这种方法:

* First create a derivated class from Entry

    public class KBLessEntry : Entry
    { 
    public KBLessEntry() : base()
    {
    }
    }

* Then create a custom platform EntryRender

    using Xamarin.Forms.Platform.Android;
    using Xamarin.Forms;
    using MobileClients.Droid.Core;
    using Android.Views.InputMethods;
    using System;
    using System.ComponentModel;

[assembly: ExportRenderer(typeof(KBLessEntry), typeof(KBLessEntryRender))]
namespace MobileClients.Droid.Core
{
    public class KBLessEntryRender : EntryRenderer
    {
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            Control.InputType = 0;
            try
            {             
                // Hide keyboard
                InputMethodManager inputMethodManager = this.Control.Context.GetSystemService(Android.Content.Context.InputMethodService) as InputMethodManager;
                if (inputMethodManager != null)
                {
                    inputMethodManager.HideSoftInputFromWindow(this.Control.WindowToken, HideSoftInputFlags.None);
                }
            }
            catch(Exception Ex)
            {

            }
        }

    }
}

And in XAML 在XAML中

 <local:KBLessEntry x:Name="TxtCode" FontSize="18" Placeholder="Código producto" TextColor="Black" HorizontalOptions="FillAndExpand"></local:KBLessEntry>

local: must be defined has an namespace in your xaml xmlns:local="clr-namespace:MobileClients.Droid.Core;assembly=MobileClients.Droid" 本地:必须定义为在您的xaml xmlns中有一个命名空间:local =“ clr-namespace:MobileClients.Droid.Core; assembly = MobileClients.Droid”

And thats it 就是这样

Try call this method: setShowSoftInputOnFocus(false); 尝试调用此方法: setShowSoftInputOnFocus(false); In my case it work good: 就我而言,它运作良好:

public class CustomKeyboardField extends android.support.v7.widget.AppCompatEditText {


    public CustomKeyboardField(Context context) {
        super(context);
        init();
    }

    public CustomKeyboardField(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomKeyboardField(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setShowSoftInputOnFocus(false);
        setCursorVisible(false);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM