Android从EditText隐藏软键盘,同时不丢失光标

时间:2012-11-27 14:26:28

标签: android android-edittext android-softkeyboard

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

我发现,如果用户在EditText内单击,则确保软键盘不会弹出的最简单方法是将inputType设置为null - 但这也会导致光标死亡。

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

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

15 个答案:

答案 0 :(得分:38)

这对我有用:

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

答案 1 :(得分:6)

我终于找到了一个(对我而言)工作解决方案。

第一部分(在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>

您可以在Grapher应用程序中看到此结果,免费并可在Google Play中使用。

答案 2 :(得分:4)

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

您可以在xml布局中设置它,如下所示:

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

或者以编程方式,像这样:

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

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

答案 3 :(得分:3)

使用

android:windowSoftInputMode="stateHidden" 

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

答案 4 :(得分: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之前requestFocus。如果没有焦点,首先点击将使键盘显示(我的经验)。但是,如果活动中有一个EditText,则会应用此选项。有了这个,您仍然可以使用自定义键盘(如果有)键入,可以复制和粘贴,并且光标仍然可见。

答案 5 :(得分:3)

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

您可以在xml布局中设置它,如下所示:

textIsSelectable

或者以编程方式,像这样:

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

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

答案 6 :(得分:2)

来自@Lupsaa here的最佳解决方案:

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

您可以在xml布局中设置它,如下所示:

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

或者以编程方式,像这样:

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

editText.setTextIsSelectable(真);

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

答案 7 :(得分:2)

cell.backgroundColor = self.colors[indexPath.row % self.colors.count]

// ...

return cell

答案 8 :(得分:1)

这完全(对我来说)分两步完成:

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

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

    android:focusable="true"
    android:focusableInTouchMode="true
    
  3. 你必须同时放置1和2,然后它才会起作用。

    干杯

答案 9 :(得分: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;
    }
});

答案 10 :(得分: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;
    }
});
哈哈......这是正确的做法...这项工作已经完成......这将会奏效!

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

如果您的最小SDK为21,则可以通过Java代码使用此方法:

editText.setShowSoftInputOnFocus(true);

贷记Chen Su article

答案 14 :(得分:0)

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

使用:

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