如何在EditText上隐藏Android软键盘

58
我有一个Activity,里面有一些EditText字段和一些按钮用于方便地填充这些字段。但是当用户触摸其中一个EditText字段时,Android软键盘会自动弹出。我希望默认情况下它保持隐藏,除非用户长按菜单按钮。我已经搜索了几个解决方案,但到目前为止我还无法让它们起作用。

我尝试了以下方法:

1 - 在onCreate方法中,

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

2-同样在onCreate方法中,

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

在清单文件中,将 3 和 fIn 改为如下形式:

<activity android:name=".activityName" android:windowSoftInputMode="stateAlwaysHidden"/>

这些方法都不起作用。每当用户单击EditText字段时,软键盘就会出现。我只希望在用户通过长按菜单键明确显示它时才出现软键盘。

为什么这不起作用?


尝试使用我的答案。也许它会有所帮助 来自这里 - ch13mob
在Android TV中,您可能需要实现一个编辑文本的行为,其中您需要创建一个不可编辑但可点击的编辑文本。这个链接可能会对您有所帮助- https://dev59.com/tGox5IYBdhLWcg3wDgEz#70285647 - Anoop M Maddasseri
16个回答

101

这将对你有所帮助

editText.setInputType(InputType.TYPE_NULL);
编辑:

要显示软键盘,您需要在菜单按钮的长按事件中编写以下代码。

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

这确实可以隐藏软键盘的出现,但如果用户长按菜单按钮能够强制软键盘出现会更好。 - ScubaSteve
感谢您的帮助。实际上,editText字段需要被掩盖,因为它是一个密码。我没有意识到(尽管这很合理),这会显示输入的内容。 - ScubaSteve
我需要对输入进行掩码处理。将输入类型设置为 null 当然会移除掩码。 - ScubaSteve
根据您的问题,我认为您已经得到了答案,如果您接受这个答案,那么它对其他人也会有帮助。现在您遇到了关于掩码的问题。您可以将其作为另一个问题提出。您是指将EditText字段掩码设置为密码字段吗?如果是这样,您可以在xml布局中使用android:password="true"或在活动中使用editText.setTransformationMethod(PasswordTransformationMethod.getInstance());来实现。 - Sandy
你实际上把这些代码放在哪里,是在onCreate等函数中吗,@Sandy? - N MC

39
您需要在您的 AndroidManifest.xml 中为 Activity 添加以下属性。
<activity
    ...
    android:windowSoftInputMode="stateHidden|adjustResize"
    ...
/>

2
谢谢Emran,它运行得很好。 - Aron
@Emran Hamza,ViewPager布局怎么办? - karimkhan
@karimkhan 将上述属性添加到包含viewpagers的Activity中。 - Martin Mbae
stateHidden足以隐藏键盘。 - Sergio

9

在长时间研究TextView类之后,我找到了一种防止键盘出现的方法。诀窍是在键盘出现后立即隐藏它,因此我搜索了一个在键盘出现后调用并隐藏它的方法。

实现了EditText类。

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);
    }
}

和样式

<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" />

2
太棒了,这是唯一可行的解决方案,我已经尝试了所有方法。 - Goran Horia Mihail
这值得获得奥斯卡奖。 - Oush
这部作品值得获得奥斯卡奖 - Oush

8
我有一个小技巧可以做到这一点,就是在布局的顶部放置一个不可见的焦点占位符。例如,它可能像这样:

有时我使用一个小技巧来做到这一点。我在布局的顶部放置一个不可见的焦点占位符。例如,它可能像这样:

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

使用这种样式

<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中,我将调用
    editInvisibleFocusHolder.setInputType(InputType.TYPE_NULL);
    editInvisibleFocusHolder.requestFocus();

对我来说,这在1.6到4.x的版本上都可以很好地工作。


这种回答其实是针对一个不同的问题 - 如何在活动启动时隐藏软键盘(OP希望在EditText聚焦事件中长按之前隐藏软键盘)。然而,这个答案对于更常见的用例来说是一个很好的参考,可能是一些用户通过搜索得到的,所以点赞。 - Rich
你甚至不需要将这个视图设置为 EditText。它可以是一个普通的 View,只需设置 focusable=truefocusableInTouchMode=true 即可。 - ashughes

8

我的测试结果:

使用 setInputType 方法:

editText.setInputType(InputType.TYPE_NULL);

软键盘消失后,光标也会消失。
使用 setShowSoftInputOnFocus 方法:
editText.setShowSoftInputOnFocus(false)

它的表现如预期一样。


6
软键盘一直弹出,即使我在视图中设置了EditorInfo.TYPE_NULL。除了我从nik431的答案中得到的想法外,其他答案都没有用。
editText.setCursorVisible(false);
editText.setFocusableInTouchMode(false);
editText.setFocusable(false);

这将隐藏键盘并使字段无法点击。 - CoolMind
它在3年前发布时并没有使该字段无法点击。可能自那时以来API已经发生了变化。 - Alex Burdusel

5

以下这行代码正是所需的内容。该方法已在 API 21 中包含,因此适用于 API 21 及以上版本。

edittext.setShowSoftInputOnFocus(false);

这个可行。处理自定义键盘的最简单解决方案。例如,带有自定义数字键盘的自定义锁屏。 - pravingaikwad07
这应该是被接受的答案,因为它是一个理想的解决方案,可以防止在EditText获得焦点时软键盘弹出,同时仍然允许用户选择和修改EditText中的文本。 - Harshal Pudale

4

似乎有多种方法可以在程序代码和xml中防止系统键盘的出现。然而,这是我在支持API 11之前的设备时使用的方法。

// 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);
}

1

让我们尝试在您的XML中为 EditText 设置如下属性

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

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


3
那个链接已经失效了 @nik431 - Amit
这个代码帮助我实现了编程:editText.setFocusableInTouchMode(false); - Alex Burdusel
这将隐藏光标并保持键盘可见。 - CoolMind

1

在活动中使用EditText.setFocusable(false);,或者在xml中使用。

android:focusable="false"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接