24

我已经走到了这一步,让我走到了一半,但并不完全。我有一个拨号器Fragment,它有所有常用Button的 s 来输入包括退格在内的数字,所以我不需要软键盘。我还想让用户能够粘贴文本(长按...默认情况下工作正常),以及编辑输入的内容,所以我需要光标。

我发现确保在用户单击内部时不会弹出软键盘的最简单方法EditText是将 设置inputType为 null - 但这也会杀死光标。

那么,无论用户尝试什么,我如何声明我的EditText以及我应该启动什么样的命令以使我的字段永远不会显示软键盘,但仍保留粘贴功能和光标?EditText

我也在android:windowSoftInputMode="stateAlwaysHidden"我的清单中尝试过,但无济于事。

4

15 回答 15

40

这对我有用:

        // 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;
        }
    });
于 2012-12-20T15:19:46.693 回答
7

I have finally found a (for me) working solution to this.

First part (in 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);
}

In addition, android:textIsSelectable needs to be set to true (or set in onCreate) and the EditText must not be focused on initialization. If your EditText is the first focusable View (which it was in my case), you can work around this by putting this just above it:

<LinearLayout
  android:layout_width="0px"
  android:layout_height="0px"
  android:focusable="true"
  android:focusableInTouchMode="true" >
    <requestFocus />
</LinearLayout>

You can see the results of this in the Grapher application, free and available in Google Play.

于 2013-01-08T21:59:22.930 回答
4

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

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

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

或以编程方式,如下所示:

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

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

于 2014-05-12T09:00:55.373 回答
4

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

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

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

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

或以编程方式,如下所示:

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

editText.setTextIsSelectable(true);

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

于 2015-04-08T08:20:58.720 回答
3

利用

android:windowSoftInputMode="stateHidden" 

在您的清单文件中,而不是android:windowSoftInputMode="stateAlwaysHidden"

于 2013-03-11T11:15:23.870 回答
3

这就是我所做的。一、在manifest里面的activity

android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"

二、在onCreateif inside activity 或者onActivityCreatedif inside fragment

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,则会应用此方法。有了这个,您仍然可以使用自定义键盘(如果有)键入,可以复制和粘贴,并且光标仍然可见。

于 2015-11-18T13:02:37.100 回答
3

您需要的确切功能是通过将textIsSelectableEditText 中的标志设置为true来提供的。这样,光标仍然存在,您将能够选择/复制/剪切/粘贴,但 SoftKeyboard 将永远不会显示. 需要 API 11 及更高版本。

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

<EditText
    android:textIsSelectable="true"
    ...
/>

或以编程方式,如下所示:

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

对于使用 API 10 及以下版本的任何人,此处提供了 hack: https ://stackoverflow.com/a/20173020/7550472

于 2017-02-11T19:21:52.190 回答
3

如果您的最小 SDK 为 21,您可以从 java 代码中使用此方法:

editText.setShowSoftInputOnFocus(false);

陈苏文章

于 2019-09-05T07:03:47.743 回答
2

这在两个步骤中完美(对我来说):

  1. <activity... android:windowSoftInputMode="stateHidden">在清单文件中

  2. 在您的 editText XML 代码中添加这些属性

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

您必须同时输入 1 和 2,只有这样它才会起作用。

干杯

于 2014-04-23T09:26:42.127 回答
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);
    }
于 2015-07-13T16:09:43.217 回答
1

我发现这个非常有用的代码,它就像魅力一样,它完全是键盘的头,但保持光标,你可以复制过去,移动光标......等等

使用 :

hideSoftKeyboard(editText);

方法:

  public void hideSoftKeyboard(EditText edit) {
           if (android.os.Build.VERSION.SDK_INT <= 10) {
               edit.setInputType(InputType.TYPE_NULL);
           } else {
               this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
               try {
                   Class<EditText> cls = EditText.class;
                   Method setSoftInputShownOnFocus;
                   setSoftInputShownOnFocus = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
                   setSoftInputShownOnFocus.setAccessible(true);
                   setSoftInputShownOnFocus.invoke(edit, false);
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
       }
于 2021-06-20T14:14:27.090 回答
1

首先android:windowSoftInputMode="stateHidden"在活动下添加清单文件。像这样

<activity... android:windowSoftInputMode="stateHidden">

在你的 xml 添加这个android:textIsSelectable="true"。这将使指针可见。

然后在活动的 onCreate 方法上,添加:

EditText editText = (EditText)findViewById(R.id.edit_text);
edit_text.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        InputMethodManager inputMethod = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (inputMethod!= null) {
            inputMethod.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }                
        return true;
    }
});
于 2018-04-24T15:28:56.123 回答
0

您可以在活动的 onCreate 方法中使用以下代码行,以确保仅当用户单击或触摸 EditText 字段时才会弹出键盘。我尝试了很多来自stackoverflow的方法和代码,但没有任何效果,但这对我来说非常有效!试试这个.. :)`

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
于 2018-09-29T12:56:55.520 回答
0

您可以在活动的 onCreate 方法中使用以下代码行,以确保仅当用户单击或触摸 EditText 字段时才会弹出键盘。我尝试了很多来自stackoverflow的方法和代码,但没有任何效果,但这对我来说非常有效!试试这个.. :)`

        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
于 2018-09-29T13:11:53.717 回答
0

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

哈……这是正确的做法……完成了这项工作……这会奏效!

于 2017-07-20T07:51:24.073 回答