经过数小时的研究,我终于找到了适用于所有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://dev59.com/WHI95IYBdhLWcg3wyRM0#9108219),并立即将其隐藏。
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();
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
if (heightDiff > 100) {
if (getCurrentFocus() != null)
{
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
}
});
}
对于我的情况,它起作用了。虽然你可以看到键盘在一瞬间弹出(这是丑陋的部分),但我现在写的时候想不出其他方法来使它工作。如果你有更好的解决方案,请留言!
如果这节省了某人的时间,请让我知道 :)
myEditText.setInputType(InputType.TYPE_NULL);
会让EditText变成单行,即使结合了InputType.TYPE_NULL | InputType.TYPE_TEXT_FLAG_MULTI_LINE
。 - Quarkandroid:textIsSelectable="true"
就可以了。是否还需要加上myEditText.setInputType(InputType.TYPE_NULL);
? - SuragchInputType
的情况下被禁用了。你使用的是哪个Android API版本? - Suragch