很多朋友困惑于EditText控件的read-only问题, 包括我. Read-only在这里的定义等同于win32 edit控件的read-only, 即: 无法通过UI更改其中的内容, 但可以选定部分内容, 进行复制.

在早期的sdk, EditText有Editable属性(至于这个属性是否有用, 没有测过, 本人入门较晚, 没使用过早期sdk), 现在这个属性已经deprecated了. 网上有大量关于此问题的内容, 要么是掩耳盗铃式的设成non-focusable, 要么是复杂的TextWatch, 始终没有发现简洁完美的方法. 当初曾被此问题折腾得够呛, 甚至用WebView替代过. 其实只需一行代码就能搞定

et.setKeyListener(null);

注意, 这里不是setOnKeyListener, 而是setKeyListener. 此方法是TextView的成员, 调用后的效果完全符合预期, 并且获得焦点后不会弹出输入法. 下面是官方文档的解释

Sets the key listener to be used with this TextView. This can be null to disallow user input. Note that this method has significant and subtle interactions with soft keyboards and other input method: see KeyListener.getContentType() for important details. Calling this method will replace the current content type of the text view with the content type returned by the key listener.

Be warned that if you want a TextView with a key listener or movement method not to be focusable, or if you want a TextView without a key listener or movement method to be focusable, you must call setFocusable again after calling this to get the focusability back the way you want it.

我想, 这也应该是官方方法了, 纳闷为啥网上搜不出来这种解决方法.

另外, setOnKeyListener其实也是可以的

et.setOnKeyListener(new OnKeyListener() {
  @Override
  public boolean onKey(View v, int keyCode, KeyEvent event) {
    return true;
  }
}); //consume key input
et.setInputType(InputType.TYPE_NULL);//禁止输入法

这种方法只经过粗略测试, 无法确定是否与前一种等价. 既然已经有完美方法了, 忘了它吧.