如何在不失去光标的情况下隐藏Android EditText中的软键盘

25
我已经到达了 这里,它让我完成了一半,但还不够。我有一个拨号器Fragment,其中包含所有常见的Button以输入数字,包括退格键,因此我不需要软键盘。我也想让用户能够粘贴文本(长按...默认情况下正常工作),以及编辑已输入的内容,因此我需要光标。
我发现确保如果用户在EditText内部单击时软键盘不会弹出的最简单方法是将设置为null - 但这也杀死了光标。那么,如何声明我的EditText并启动什么样的命令,以便我的EditText字段永远不会显示软键盘,无论用户尝试什么,但仍保留粘贴功能和光标?
我还尝试了在清单中使用android:windowSoftInputMode="stateAlwaysHidden",但没有任何效果。

你有检查过这个吗?https://dev59.com/vHNA5IYBdhLWcg3wC5Xh - sdabet
是的 - 大多数方法都可以。对于其余的,您会在另一个线程中发现有人报告说如果用户在EditText框内单击,则键盘仍将出现。我想您可以使用焦点侦听器再次隐藏键盘,但用户仍然会看到键盘在被发送之前快速出现。我正在寻找一种方法来告诉操作系统在这个特定的片段中永远关闭键盘。 - Stephan Steiner
15个回答

41
这是我的解决方案:

对我有用:

        // Update the EditText so it won't popup Android's own keyboard, since I have my own.
    EditText editText = (EditText)findViewById(R.id.edit_mine);
    editText.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            v.onTouchEvent(event);
            InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }                
            return true;
        }
    });

2
这是我在几个小时里找到的唯一可行的解决方案。所有其他方法都会使EditText小部件无响应(无焦点,无光标),或者让软键盘早或晚出现... - thelawnmowerman
2
我使用了你的解决方案,现在我的键盘不再闪烁了。 - yAnTar
我爱你!我一整天都在寻找解决方案,而这个是完美的! - Arthur
1
不幸的是,一旦EditText获得焦点而没有触摸,软键盘就会显示出来。 - 4ntoine
1
我喜欢这个解决方案。但是当我按住Edit Text中的文本时,如何防止我的应用程序崩溃? - the_prole
显示剩余2条评论

8
我最终找到了一个(对我来说)可行的解决方案。第一部分(在 onCreate 中):
// Set to TYPE_NULL on all Android API versions
mText.setInputType(InputType.TYPE_NULL);
// for later than GB only
if (android.os.Build.VERSION.SDK_INT >= 11) {
    // this fakes the TextView (which actually handles cursor drawing)
    // into drawing the cursor even though you've disabled soft input
    // with TYPE_NULL
    mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}

此外,android:textIsSelectable需要设置为true(或在onCreate中设置),并且EditText在初始化时不应该获得焦点。如果您的EditText是第一个可聚焦的视图(在我的情况下是这样),可以通过将以下内容放置在其上方来解决此问题:
<LinearLayout
  android:layout_width="0px"
  android:layout_height="0px"
  android:focusable="true"
  android:focusableInTouchMode="true" >
    <requestFocus />
</LinearLayout>

您可以在 Google Play 中免费获取 Grapher 应用程序,从而查看此类结果。


很好,可以运行,但请在你的答案中加入粗体文本 android:textIsSelectable="true"。谢谢。 - yAnTar
缺少的是<requestFocus />这一行。添加上这一行后,其余部分就可以正常工作了。 - Eric Engel

4

@Lupsaa提供的最佳解决方案在这里

将标志textIsSelectable设置为true可禁用软键盘。

您可以像这样在xml布局中设置它:

<EditText
android:id="@+id/editText"
...
android:textIsSelectable="true"/>

或者通过编程方式,就像这样:

EditText editText = (EditText) findViewById(R.id.editText);

editText.setTextIsSelectable(true);

这个方法可以让EditText控件的文本可选择,也就是可以选中、复制、剪切和粘贴。但是软键盘不会弹出。


1
这对我有用。 在我尝试过的所有方法中,这一个解决了我的问题。 - other Tall guy

4

将标志textIsSelectable设置为true可以禁用软键盘。

您可以像这样在xml布局中设置它:

<EditText
    android:id="@+id/editText"
    ...
    android:textIsSelectable="true"/>

或者像这样通过编程实现:

EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

光标仍然存在,您可以选择/复制/剪切/粘贴,但软键盘将永远不会显示。

4
如果您的最小SDK版本为21,您可以从Java代码中使用此方法:
editText.setShowSoftInputOnFocus(false);

感谢Chen Su的文章


这会在点击EditText时显示键盘,因此无法使用。 - Ali Asheer
这个解决方案解决了“在不失去光标的情况下隐藏EditText中的软键盘”问题。 - Alex Misiulia
在我的情况下它不起作用,而且参数应该是(false)而不是true。当你点击edittext时,键盘仍然会弹出。 - Ali Asheer
谢谢您的纠正,我已经更新了我的答案。您可以查看其他答案,似乎您的情况比陈苏描述的更加复杂。 - Alex Misiulia

3
这是我所做的事情。 首先,在活动内的清单中。
android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"

其次,在活动中使用时应在onCreate中使用,在碎片中使用则应在onActivityCreated中使用。
editText.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            hideSoftKeyboard(v);
        }
    });

不要忘记请求焦点到editText。
editText.requestFocus();

然后添加与其他答案相同的hideSoftKeyboard(v)方法。
private void hideSoftKeyboard(View v){
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

关键在于在单击EditText之前请求焦点。如果没有焦点,第一次单击将使键盘显示出来(我的经验)。但是,如果您在活动中只有一个EditText,则适用此方法。通过这种方法,您仍然可以使用自定义键盘(如果有),可以复制和粘贴,并且光标仍然可见。


3

使用

android:windowSoftInputMode="stateHidden" 

在您的清单文件中,将android:windowSoftInputMode="stateAlwaysHidden"替换为


3
您所需要的确切功能可通过在EditText中设置textIsSelectable标志为true来提供。这样,光标仍然存在,您将能够选择/复制/剪切/粘贴,但是软键盘永远不会显示。需要API 11及以上版本。您可以像这样在xml布局中设置它:
<EditText
    android:textIsSelectable="true"
    ...
/>

或者通过编程实现,像这样:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);

对于使用API 10及以下版本的用户,可以在此处找到hack方法: https://dev59.com/4mUp5IYBdhLWcg3wmIUt#20173020


2
这对我来说在2个步骤中完美地运作:

第一步:

第二步:

  1. <activity... android:windowSoftInputMode="stateHidden"> in manifest file

  2. Add these properties in your editText XML code

    android:focusable="true"
    android:focusableInTouchMode="true
    

你必须同时放置数字1和2,才能使其正常工作。

干杯!


2
    EditText text = (EditText) findViewById(R.id.text);
    if (Build.VERSION.SDK_INT >= 11) {
        text.setRawInputType(InputType.TYPE_CLASS_TEXT);
        text.setTextIsSelectable(true);
    } else {
        text.setRawInputType(InputType.TYPE_NULL);
        text.setFocusable(true);
    }

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