从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自己的软键盘。
 要禁用系统键盘,自动popupEditText或TextView请执行以下操作: 
 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 }