您的位置:首页 > 移动开发 > Android开发

关于EditText的一点深入的了解

2015-11-25 14:48 513 查看
最近在开发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() {
<span class="indent">  </span> //S:变化后的所有字符;<span class="operator"><span class="keyword">start</span>:字符起始的位置;before: 变化之前的总字节数;<span class="aggregate">count</span>:变化后的字节数
<span class="indent">  </span><span class="keyword">public</span> void onTextChanged(CharSequence s, <span class="keyword">int</span> <span class="keyword">start</span>, <span class="keyword">int</span> before, <span class="keyword">int</span> <span class="aggregate">count</span>) {
<span class="indent">  </span>}
//s:变化前的所有字符; <span class="keyword">start</span>:字符开始的位置; <span class="aggregate">count</span>:变化前的总字节数;after:变化后的字节数
<span class="indent">  </span><span class="keyword">public</span> void beforeTextChanged(CharSequence s, <span class="keyword">int</span> <span class="keyword">start</span>, <span class="keyword">int</span> <span class="aggregate">count</span>,
<span class="indent">  </span><span class="indent">  </span>  <span class="keyword">int</span> after) {
<span class="indent">  </span>}
//s:变化后的所有字符
<span class="indent">  </span><span class="keyword">public</span> void afterTextChanged(Editable s) {
<span class="indent">  </span>}
});</span>


因此如果有需要,或者对EditText做一些个性化的设置,即可以使用addTextChangedListener来为EditText添加监听器!

=========================================================================================

三、制作只读的EditText控件

首先说明一下需求: 该EditText只会禁止输入,但是可以查看,滚动和触摸什么的都会响应,也就是说仅仅是禁止输入而已! 不妨称之为只读模式。

怎么制作出一个这样子的EditText呢?网上有很多办法,我几乎都一一试过,但是所使用的方法都无法达到满意。比如:

(1)如果通过设定android:editable属性来使EditText不可输入。这个虽然能完美的达到要求。 但是,当EditText又需要恢复可输入状态时,没有相应的动态代码来恢复!

(2)如果使用 android:enabled属性,则会使EditText整个不可用,也就是说不仅不可输入,连滚动什么的都不用了。

最后,理了理思路,终于解决了这个问题。达到我的预期: 即EditText只读模式达到了,在恢复其可编辑状态时也能很容易的恢复。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我的做法如下:
制作出一个只读模式的<span class="constant">EditText</span>

其实很简单进行下面两步设定即可:
(<span class="number">1</span>)只读模式,当然不需要显示光标了。在xml中设置如下即可:
<span class="symbol">android:</span>cursorVisible=<span class="string">"false“
(2)只读模式当然不需要弹出输入法了,输入法不弹出,当然就不能编辑了。为了点到EditText不让弹出输入法,我们只需让其对触摸事件不响应即可:
android:focusableInTouchMode="</span><span class="keyword">false</span><span class="string">"

经过上面两步简单的设定,就可以让EditText为只读模式了。

然后恢复EditText为可编辑:

根据上面的设定,因此想要将EditText恢复为可编辑状态,只需要下面两行代码即可:
editText.setFocusableInTouchMode(true);

editText.setCursorVisible(true);
</span>


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

另外需要说明的是,也可以利用下面的方法动态的设定EditText的可输入与不可输入状态。

动态设定EditText不可输入任何字符
<span class="comment">//设置EditText不可输入。但保留滑动,可点击等属性。只是不可输入而已</span>
et.setFilters(<span class="keyword">new</span> InputFilter[] { <span class="keyword">new</span> InputFilter() {
<span class="indent">  </span><span class="annotation">@Override</span>
<span class="indent">  </span><span class="keyword">public</span> CharSequence filter(CharSequence source, <span class="keyword">int</span> start,
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword">int</span> end, Spanned dest, <span class="keyword">int</span> dstart, <span class="keyword">int</span> dend) {
<span class="indent">  </span><span class="indent">  </span><span class="keyword">return</span> source.length() < <span class="number">1</span> ? dest.subSequence(dstart, dend) : <span class="string">""</span>;
<span class="indent">  </span>}
<span class="indent">  </span>} });


这样,利用上面的代码,即使你利用输入键盘输入,也无法输入到EditText中。对应的,相应的恢复输入可采用下面的代码:
<span class="comment">//设置输入法可以输入(或者叫恢复输入)</span>
et.setFilters(<span class="keyword">new</span> InputFilter[] { <span class="keyword">new</span> InputFilter() {
<span class="keyword">public</span> CharSequence filter(CharSequence source, <span class="keyword">int</span> start,
<span class="indent">  </span>    <span class="keyword">int</span> end, Spanned dest, <span class="keyword">int</span> dstart, <span class="keyword">int</span> dend) {
<span class="indent">  </span><span class="comment">// TODO Auto-generated method stub</span>
<span class="indent">  </span><span class="keyword">return</span> <span class="keyword">null</span>;
}
} });


=================================================================================

四、不自动弹出输入法的键盘

当你的布局中含有一个EditText中的时候,你会发现只要你进入这个活动的界面,输入法键盘就会自动弹出来。在你不打算首先给EditText做输入的时候,

这个自动弹出的输入法则是非常惹人讨厌的!因此可以利用下面的两种办法来禁止因为有了EditText而自动弹出输入法:
(1)方法一
<span class="indent">  </span>经过测验,如果EditText和TextView在一起的话,那么输入法就不会自动弹出。这是由于TextView本身的特性导致的。顺便说一句,EditText本身就是继承自TextView的。
<span class="indent">  </span>因此,你可以放一个TextView到你的布局中,来防止自动弹出输入法。
(2)方法二
<span class="indent">  </span>还可以利用代码动态设定不弹出输入法。只需要在合适的地方,写下下面的代码即可。下面的代码就是让EditText默认不显示软键盘,只有当被点击的时候才会显示出软键盘
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span> WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);


=========================================================================================

五、设置EditText显示为密码格式

有两种方式,即在xnl中和利用代码动态设定。如下:
(1)方式一
android:inputType="textPassword"
(2)方式二
edit.setTransformationMethod(PasswordTransformationMethod.getInstance());


inputType即为输入字符的类型。在这里网上有个很好的总结,如下:
1 android:inputType参数类型说明
2 android:inputType="none"<span class="comment">--输入普通字符</span>
3 android:inputType="text"<span class="comment">--输入普通字符</span>
4 android:inputType="textCapCharacters"<span class="comment">--输入普通字符</span>
5 android:inputType="textCapWords"<span class="comment">--单词首字母大小</span>
6 android:inputType="textCapSentences"<span class="comment">--仅第一个字母大小</span>
7 android:inputType="textAutoCorrect"<span class="comment">--前两个自动完成</span>
8 android:inputType="textAutoComplete"<span class="comment">--前两个自动完成</span>
9 android:inputType="textMultiLine"<span class="comment">--多行输入</span>
10 android:inputType="textImeMultiLine"<span class="comment">--输入法多行(不一定支持)</span>
11 android:inputType="textNoSuggestions"<span class="comment">--不提示</span>
12 android:inputType="textUri"<span class="comment">--URI格式</span>
13 android:inputType="textEmailAddress"<span class="comment">--电子邮件地址格式</span>
14 android:inputType="textEmailSubject"<span class="comment">--邮件主题格式</span>
15 android:inputType="textShortMessage"<span class="comment">--短消息格式</span>
16 android:inputType="textLongMessage"<span class="comment">--长消息格式</span>
17 android:inputType="textPersonName"<span class="comment">--人名格式</span>
18 android:inputType="textPostalAddress"<span class="comment">--邮政格式</span>
19 android:inputType="textPassword"<span class="comment">--密码格式</span>
20 android:inputType="textVisiblePassword"<span class="comment">--密码可见格式</span>
21 android:inputType="textWebEditText"<span class="comment">--作为网页表单的文本格式</span>
22 android:inputType="textFilter"<span class="comment">--文本筛选格式</span>
23 android:inputType="textPhonetic"<span class="comment">--拼音输入格式</span>
24 android:inputType="number"<span class="comment">--数字格式</span>
25 android:inputType="numberSigned"<span class="comment">--有符号数字格式</span>
26 android:inputType="numberDecimal"<span class="comment">--可以带小数点的浮点格式</span>
27 android:inputType="phone"<span class="comment">--拨号键盘</span>
28 android:inputType="datetime"
29 android:inputType="date"<span class="comment">--日期键盘</span>
30 android:inputType="time"<span class="comment">--时间键盘</span>


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

在这里再插一句吧。 说一下EditText或者TextView中的setInputType和setTransformationmethod方法。

(1)setinputType可以设置EditText(TextView也可以)的输入方式。比如Contact、Email、Date、Time、Short Message、Normal Text、Password 等。

还可以指定各种更正选项,如 单词首字母大写、句子首字母大写、自动更正等。下面的代码是一个使用范例:
<span class="keyword">int</span> inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
| InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
| InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE;
EditText.setInputType(inputType);


(2) setTransformationMethod则可以支持将输入的字符转换,包括清除换行符、转换为掩码。使用方法:
<span class="attribute">textView.setTransformationMethod(PasswordTransformationMethod.getInstance());</span>


综合来说,如果需要实现自己的转换,可以通过实现 TransformationMethod 接口来达到你的目的(比如让输入的所有字符都变成 a,或者输入 a 显示 z,输入 z 显示 a 等)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 控件 EditText