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

新手上路,请多包涵

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

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

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

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

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

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

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

任何解决方案?谢谢

原文由 hrsetyono 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 766
2 个回答

经过数小时的研究,我终于找到了适用于所有 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"

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

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

使用下面的代码检测键盘是否出现(从 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);
            }
            }
         }
        });
}

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

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

原文由 Bruce 发布,翻译遵循 CC BY-SA 3.0 许可协议

要禁用软键盘显示,保留复制/粘贴和光标功能,只需在您的活动中添加以下行:

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

原文由 Santacrab 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题