经过数小时的研究,我终于找到了适用于所有 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);
}
}
}
});
}
它适用于我的情况。尽管您可以在一瞬间看到键盘出现(这是丑陋的部分),但在撰写本文时我想不出任何其他方法可以使其正常工作。如果您有更好的解决方案,请发表评论!
如果这可以节省某人的时间,请告诉我:)