如何在EditText上隐藏Android软键盘

How to hide Android soft keyboard on EditText

我有一个带有一些EditText字段和一些按钮的Activity,以方便通常用于填充这些字段的内容。 但是,当我们用户触摸其中一个EditText字段时,会自动显示Android软键盘。 我希望它默认保持隐藏状态,除非用户长按菜单按钮。 我已经找到了解决方案,并找到了几个答案,但到目前为止我无法让它们工作。

我尝试过以下方法:

1 - 在onCreate方法中,

1
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

2 - 同样在onCreate方法中,

1
2
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY);

3 - 和fIn清单文件,

1
 

这些方法都不起作用。 只要用户单击EditText字段,就会出现软键盘。 如果用户通过长按菜单键明确显示软键盘,我只想显示软键盘。

为什么这不起作用?


这会对你有所帮助

1
editText.setInputType(InputType.TYPE_NULL);

编辑:

要显示软键盘,您必须在long key press event of menu button中编写以下代码

1
2
3
4
editText.setInputType(InputType.TYPE_CLASS_TEXT);
            editText.requestFocus();
            InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            mgr.showSoftInput(editText, InputMethodManager.SHOW_FORCED);


您需要为AndroidManifest.xml中的Activity添加以下属性。

1
2
3
4
5
<activity
    ...
    android:windowSoftInputMode="stateHidden|adjustResize"
    ...
/>


我有时会使用一些技巧来做到这一点。我在布局的顶部放置了一个隐形焦点支架。这将是例如像这样

1
2
 <EditText android:id="@id/editInvisibleFocusHolder"
          style="@style/InvisibleFocusHolder"/>

有这种风格

1
2
3
4
5
6
7
<style name="InvisibleFocusHolder">
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_height">0dp</item>
    <item name="android:focusable">true</item>
    <item name="android:focusableInTouchMode">true</item>
    <item name="android:inputType">none</item>
</style>

然后在onResume我会打电话

1
2
    editInvisibleFocusHolder.setInputType(InputType.TYPE_NULL);
    editInvisibleFocusHolder.requestFocus();

这对我来说很有效,从1.6到4.x


经过长时间查看TextView类,我发现了一种防止键盘出现的方法。诀窍是它出现后立即隐藏它,所以我搜索了键盘出现后调用的方法并隐藏它。

实现了EditText类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class NoImeEditText extends EditText {

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

    /**
     * This method is called before keyboard appears when text is selected.
     * So just hide the keyboard
     * @return
     */
    @Override
    public boolean onCheckIsTextEditor() {
        hideKeyboard();

        return super.onCheckIsTextEditor();
    }

    /**
     * This methdod is called when text selection is changed, so hide keyboard to prevent it to appear
     * @param selStart
     * @param selEnd
     */
    @Override
    protected void onSelectionChanged(int selStart, int selEnd) {
        super.onSelectionChanged(selStart, selEnd);

        hideKeyboard();
    }

    private void hideKeyboard(){
        InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getWindowToken(), 0);
    }
}

和风格

1
2
3
4
5
6
<com.my.app.CustomViews.NoImeEditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:editable="false"
    android:background="@null"
    android:textSize="@dimen/cell_text" />


即使我将EditorInfo.TYPE_NULL设置为视图,软键盘仍然保持上升。
除了我从nik431的答案得到的想法之外,没有一个答案对我有用:

1
2
3
editText.setCursorVisible(false);
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);


以下行正是正在寻找的内容。此方法已包含在API 21中,因此适用于API 21及以上。

1
edittext.setShowSoftInputOnFocus(false);


似乎有很多种方法可以阻止系统键盘出现,无论是以编程方式还是以xml方式显示。但是,这是支持API 11之前设备的方式。

1
2
3
4
5
6
7
8
// prevent system keyboard from appearing
if (android.os.Build.VERSION.SDK_INT >= 11) {
    editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
    editText.setTextIsSelectable(true);
} else {
    editText.setRawInputType(InputType.TYPE_NULL);
    editText.setFocusable(true);
}

我的测试结果:

setInputType

1
editText.setInputType(InputType.TYPE_NULL);

软键盘消失,但光标也会消失。

使用setShowSoftInputOnFocus

1
editText.setShowSoftInputOnFocus(false)

它按预期工作。


让我们尝试在xml中为EditText设置以下属性

1
android:focusableInTouchMode="true" android:cursorVisible="false".

如果您想在启动活动时隐藏软键盘,请浏览此链接


1
2
3
4
5
6
7
8
9
10
11
   public class NonKeyboardEditText extends AppCompatEditText {

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

    @Override
    public boolean onCheckIsTextEditor() {
        return false;
    }
}

并添加

1
NonKeyboardEditText.setTextIsSelectable(true);


基于相同简单指令的三种方式:

一个)。结果像locate(1)一样简单:

1
android:focusableInTouchMode="true"

在布局中任何先前元素的配置中,例如:

如果您的整个布局由以下内容组成:

1
2
3
4
5
6
7
<ImageView>

<EditTextView>

<EditTextView>

<EditTextView>

然后你可以在ImageView参数中编写(1),这将抓住android的注意力而不是EditText。

B)。如果您有另一个先前元素而不是ImageView,您可能需要将(2)添加到(1):

1
android:focusable="true"

C)。您还可以在视图元素的顶部创建一个空元素:

1
2
3
4
5
<LinearLayout
  android:focusable="true"
  android:focusableInTouchMode="true"
  android:layout_width="0px"
  android:layout_height="0px" />

这个替代方案直到这一点成为我所见过的最简单的结果。希望能帮助到你...


隐藏键盘

1
editText.setInputType(InputType.TYPE_NULL);

显示键盘

1
2
etData.setInputType(InputType.TYPE_CLASS_TEXT);
etData.setFocusableInTouchMode(true);

在父布局中

1
android:focusable="false"

简单地使用
EditText.setFocusable(false);在活动中

要么
在xml中使用

1
android:focusable="false"

您好使用此代码它对我来说100%正常工作

1
2
EditText ee=new EditText(this);
ee.setShowSoftInputOnFocus(false);

*但你只想隐藏键盘上的edittext点击下面给出的代码将工作但键盘图标和后退按钮的向上标志将创建*给定的代码是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        EditText ee=new EditText(this);//create edittext
        final   View.OnTouchListener disable =new View.OnTouchListener() {
        public boolean onTouch (View v, MotionEvent event) {
        v.onTouchEvent(event);
        InputMethodManager img =
        (InputMethodManager)v.getContext().getSystemService(INPUT_METHOD_SERVICE);
        if (img != null) {
        img.hideSoftInputFromWindow(v.getWindowToken(),0);
        }
        return true;
        }
        };
        //call touch listener
       ee.setOnTouchListener(disable);

在文本更改侦听器的情况下也使用它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        EditText ee= new EditText(this);
        Text=new TextWatcher(){

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int
        after) {
        InputMethodManager img = (InputMethodManager)
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        InputMethodManager img = (InputMethodManager)
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }
       @Override
        public void afterTextChanged(Editable s) {
        InputMethodManager img = (InputMethodManager)
        getSystemService(INPUT_METHOD_SERVICE);
        img.hideSoftInputFromWindow(ee.getWindowToken(), 0);

        }
        };
       ee.addTextChangedListener(Text);

在onclick监听器的情况下也使用它

1
2
3
4
5
6
7
8
 EditText ee=new EditText(this);
 ee.setOnClickListener(new View.OnClickListener() {
 public void onClick(View v) {

 InputMethodManager img= (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
 img.hideSoftInputFromWindow(ee.getWindowToken(),0);

 }});

所有代码都可以使用,但对我来说,第一个代码是最好的


只需使用以下方法

1
2
3
4
private fun hideKeyboard(activity: Activity, editText: EditText) {
    editText.clearFocus()
    (activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(editText.windowToken, 0)
}

1
2
weekText = (EditText) layout.findViewById(R.id.weekEditText);
weekText.setInputType(InputType.TYPE_NULL);