从EditText禁用软键盘,但仍然允许复制/粘贴?

您好我正在自定义拨号,所以我创build了我自己的input板。

问题是如何禁用EditText, 但仍然允许剪切/复制/粘贴? 股票拨号可以做到这一点。

我已经尝试android:focusable="false"但它禁用剪切/复制(仍然可以粘贴)。

我也尝试禁用所有三个命令禁用编程的inputType

 myEditText.setInputType(InputType.TYPE_NULL); //Can't cut/copy/paste 

从清单中禁用它也不起作用:

 android:configChanges="orientation|keyboardHidden" //Keyboard still popped up 

任何解决scheme 谢谢

经过数小时和数小时的研究,我终于find了适用于所有API版本的解决scheme。 希望这节省了一些时间。

如果您正在开发API> = 11,则解决scheme很简单:

1)在EditText的xml文件中添加下面的两个属性

 android:inputType="none" android:textIsSelectable="true" 

要么

2)以编程方式执行下面的操作

 myEditText.setInputType(InputType.TYPE_NULL); myEditText.setTextIsSelectable(true); 

你完成了。

如果你想要迎合API <11,我发现如果你想select文本复制粘贴的目的,没有办法禁用键盘popup。 将focusable设置为false将会禁用键盘,但是它不起作用,因为它也禁用了select文本的function。 在stackoverflow中find的任何其他解决scheme都不起作用,或者同时禁用文本select。

解决这个问题的一个难看的方法就是这样。

首先,在EditText的xml文件中添加此属性

 android:editable="false" 

是的,这已经被弃用了,但是为了使EditText在API版本<11中不可编辑。

接下来,我们将需要隐藏键盘,以便我们可以继续select文本,而不会阻塞键盘。

使用下面的代码来检测显示的键盘(从https://stackoverflow.com/a/9108219/1241783获得的解决scheme),并立即隐藏。;

 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect r = new Rect(); //r will be populated with the coordinates of your view that area still visible. activityRootView.getWindowVisibleDisplayFrame(r); int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top); if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard... //Hide the keyboard instantly! if (getCurrentFocus() != null) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } } } }); } 

它适用于我的情况。 虽然你可以看到键盘出现在一瞬间(这是丑陋的一部分),但我想不出有什么其他的方式来得到这个在写作时的工作。 如果您有更好的解决scheme,请发表评论!

让我知道,如果这节省了一些人的时间:)

要禁用软键盘显示,请保留复制/粘贴和游标function,只需在活动中添加以下行:

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

由于当前的最佳答案使用了不赞成使用的方法,并且没有用于我的粘贴方法,所以这是另一种不使用旧方法的方法。 但是,它确实尝试通过reflection来使用隐藏方法。 =)

我已经将EditText到一个名为KeyboardlessEditText的新小部件中,该小部件仍然保留了没有显示键盘的所有酷编辑function。 只要把文件放进去就可以了。

完整的代码是这个post有点长,但只要GitHub不下来,那么这将工作: https : //github.com/danialgoodwin/android-widget-keyboardless-edittext/blob/master/KeyboardlessEditText2的.java

尝试这个

  EditText et = ... // your EditText et.setKeyListener(null) //makes the EditText non-editable so, it acts like a TextView. 

不需要子类。 这与使EditText不可聚焦的主要区别在于,EditText仍然有自己的光标 – 你可以select文本等等。它所做的就是抑制IMEpopup自己的软键盘。

要禁用系统键盘,自动popupEditTextTextView请执行以下操作:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { editTextView.setShowSoftInputOnFocus(false); } else { editTextView.setTextIsSelectable(true); //NB Accepting the case when non editable text will be selectable }