从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 }