EditText完美实现只读(Read-Only/Non-Editable)

来源:互联网 发布:九品网络电视 是什么 编辑:程序博客网 时间:2024/06/05 14:11
很多朋友困惑于EditText控件的read-only问题, 包括我. Read-only在这里的定义等同于win32 edit控件的read-only, 即: 无法通过UI更改其中的内容, 但可以选定部分内容, 进行复制.在早期的sdk, EditText有Editable属性,现在这个属性已经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 inputet.setInputType(InputType.TYPE_NULL);//禁止输入法

看到这个问题大家可能有点奇怪了,EditText的功能不就是往上面写入内容吗?再者,如果真要禁止输入文本,在布局文件中添加android:focusable="false",或者在代码中使用editText.setFocusable(false),不就Ok了?
项目需求是这样的,如果EditText上面已经被setText()内容,则需要禁止输入,防止它被修改。
如果没有显示内容,则将EditText设置为可输入状态。
经过测试验证:setFocusable方法的效果只有第一次使用时有效,也就是说若在布局文件里面设置:
android:focusable="false",即使你在代码中设置此控件属性:editText.setFocusable(true);也不能对它进行编辑。
即setFocusable方案不可行。经过摸索得出可行方案。
利用 editText.setInputType(InputType.TYPE_NULL);来禁止手机软键盘。
editText.setInputType(InputType.TYPE_CLASS_TEXT);来开启软键盘。
应用程序默认为开启状态。
特别注意:这种方法也只能禁止软键盘,若手机自带硬键盘,此方案失效。

public class EditTextTest extends Activity{/** test EditText forbid input function demo  */EditText editText;boolean flag = true;public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);editText = (EditText) findViewById(R.id.editText1);Button btn = (Button) findViewById(R.id.button1);btn.setOnClickListener(new OnClickListener(){public void onClick(View v){if (flag==true){System.out.println("开启软键盘"); editText.setInputType(InputType.TYPE_CLASS_TEXT);flag = false;}else{System.out.println("禁止软键盘"); editText.setInputType(InputType.TYPE_NULL);flag = true;}}});}}



原创粉丝点击