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

标签 android android-edittext

您好,我正在制作自定义拨号器,所以我创建了自己的输入板。

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

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

我还尝试以编程方式禁用 inputType,这会禁用所有三个命令:

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

从 list 中禁用它也不起作用:

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

有什么解决办法吗?谢谢

最佳答案

经过数小时的研究,我终于找到了适用于所有 API 版本的解决方案。希望这可以节省一些人的时间。

如果您正在为 API >= 11 进行开发,则解决方案很简单:

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

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

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

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

你已经完成了。

如果您还想满足 API < 11 的要求,我发现如果您想选择文本进行复制粘贴,则无法禁用键盘弹出。将 focusable 设置为 false 将禁用键盘,但它无济于事,因为它也会禁用您选择文本的能力。我在 stackoverflow 中找到的任何其他解决方案都不起作用或同时禁用文本选择。

解决这个问题的一个丑陋的方法就是这样......

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

android:editable="false"

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

接下来,我们需要在键盘出现时立即隐藏它,这样我们就可以继续选择文本而不会被键盘挡住。

使用下面的代码来检测键盘出现(从 https://stackoverflow.com/a/9108219/1241783 获得的解决方案),并立即隐藏它。

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

它适用于我的情况。尽管您可以在一瞬间看到键盘出现(这是丑陋的部分),但在撰写本文时我想不出任何其他方法可以使其正常工作。如果您有更好的解决方案,请发表评论!

如果这样可以节省某人的时间,请告诉我:)

关于android - 从 EditText 禁用软键盘但仍允许复制/粘贴?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15174606/

相关文章:

Android - ListView 像三星联系人一样向左/向右滑动 ListView

android - 使用带有 Android 客户端的 Tastypie Django 上传文件

android - 以编程方式设置形状颜色

java - 如何在 android 中将 EditText 绘制到 Canvas ?

android - 没有 singleLine 选项的 EditText 的 actionDone

android-layout - 如何在 ICS 样式的 EditText 中更改线条的颜色

android - Android WorkManager 中的异步 Worker

android - 微调器下拉外边框

android - 单击按钮显示编辑文本框

android-layout - Android:编辑文本提示