最近在开发Android下的记事本程序时,频繁的使用EditText控件,折腾来折腾去,算是对其的了解更深入了一些。特将这些收获记录如下:
一、几个属性的介绍
android:gravity="top"
这个属性为top可以将光标置于左上角(当EditText设为全屏时)
android:background="@null"
这个属性为null可以将输入的框线去掉
android:textCursorDrawable="@drawable/ic_launcher"
这个属性可以设置光标为drawable样式(可以为一张图片)
android:editable="false"
这个属性为false,则EditText不可编辑。注意是仅仅不能进行输入,但是EditText的滚动什么的还是可以响应的。
android:enabled="false"
这个属性为false,则EditText也是不可编辑。注意不仅不可编辑,连滚动什么的都不可以响应,所以可以说是直接让EditText不可用。
android:cursorVisible="false“
这个属性为false,则EditText的光标不可见。
android:focusableInTouchMode="false"
这个属性为false,则EditText不响应触摸模式的焦点,或者说触摸事件不可用。
二、监听EditText的输入
可以使用TextWatcher来监听EditText的输入。使用方法如下:
Et.addTextChangedListener(new TextWatcher() {
//S:变化后的所有字符;start:字符起始的位置;before: 变化之前的总字节数;count:变化后的字节数
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
//s:变化前的所有字符; start:字符开始的位置; count:变化前的总字节数;after:变化后的字节数
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
//s:变化后的所有字符
public void afterTextChanged(Editable s) {
}
});
因此如果有需要,或者对EditText做一些个性化的设置,即可以使用addTextChangedListener来为EditText添加监听器!
三、制作只读的EditText控件
首先说明一下需求:该EditText只会禁止输入,但是可以查看,滚动和触摸什么的都会响应,也就是说仅仅是禁止输入而已!不妨称之为只读模式。
怎么制作出一个这样子的EditText呢?网上有很多办法,我几乎都一一试过,但是所使用的方法都无法达到满意。比如:
(1)如果通过设定android:editable属性来使EditText不可输入。这个虽然能完美的达到要求。但是,当EditText又需要恢复可输入状态时,没有相应的动态代码来恢复!
(2)如果使用android:enabled属性,则会使EditText整个不可用,也就是说不仅不可输入,连滚动什么的都不用了。
最后,理了理思路,终于解决了这个问题。达到我的预期:即EditText只读模式达到了,在恢复其可编辑状态时也能很容易的恢复。
我的做法如下:
制作出一个只读模式的EditText
其实很简单进行下面两步设定即可:
(1)只读模式,当然不需要显示光标了。在xml中设置如下即可:
android:cursorVisible="false“
(2)只读模式当然不需要弹出输入法了,输入法不弹出,当然就不能编辑了。为了点到EditText不让弹出输入法,我们只需让其对触摸事件不响应即可:
android:focusableInTouchMode="false"
经过上面两步简单的设定,就可以让EditText为只读模式了。
然后恢复EditText为可编辑:
根据上面的设定,因此想要将EditText恢复为可编辑状态,只需要下面两行代码即可:
editText.setFocusableInTouchMode(true);
editText.setCursorVisible(true);
另外需要说明的是,也可以利用下面的方法动态的设定EditText的可输入与不可输入状态。
动态设定EditText不可输入任何字符
//设置EditText不可输入。但保留滑动,可点击等属性。只是不可输入而已 et.setFilters(new InputFilter[] { new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { return source.length() < 1 ? dest.subSequence(dstart, dend) : ""; } } });
这样,利用上面的代码,即使你利用输入键盘输入,也无法输入到EditText中。对应的,相应的恢复输入可采用下面的代码: