EditText设置/隐藏光标位置、选中文本和获取/清除焦点

天发现EditText这个组件,当你设置一个的高度(如,150dp),或者多行时,默认光标的位置是居中显示的,一直找不到方法如何把光标定位在最上面的左边。


原来 是一个属性的设置问题。


默认EditText 组件的 android:gravity 这个属性的值为 center 


把它改为 android:gravity="top" 就ok了!


有时候需要让光标显示在EditText的指定位置或者选中某些文本。同样,为了方便用户输入以提升用户体验,可能需要使EditText获得或失去焦点。
1. 设置光标到指定位置

 
 
  1. EditText et = (EditText) findViewById(R.id.etTest);
  2. et.setSelection(2);


PS:当内容过多时,可通过设置光标位置来让该位置的内容显示在屏幕上。
2. 隐藏光标

 
 
  1. EditText et = (EditText) findViewById(R.id.etTest);
  2. //设置光标不显示,但不能设置光标颜色
  3. et.setCursorVisible(false);

3. 获得焦点时全选文本

 
 
  1. EditText et = (EditText) findViewById(R.id.etTest);
  2. et.setSelectAllOnFocus(true);


PS:此方法可用来在用户点击EditText时,选中默认内容。
4. 获取和失去焦点

 
 
  1. EditText et = (EditText) findViewById(R.id.etTest);
  2. et.requestFocus(); //请求获取焦点
  3. et.clearFocus(); //清除焦点

5. 综合运用代码

 
 
  1. EditText et = (EditText) findViewById(R.id.etTest);
  2. int index = et.getSelectionStart();//获取光标所在位置
  3. String text="#请在这里输入话题#";
  4. Editable edit = et.getEditableText();//获取EditText的文字
  5. if (index < 0 || index >= edit.length() ){
  6. edit.append(text);
  7. }else{
  8. edit.insert(index,text);//光标所在位置插入文字
  9. }
  10. et.setSelection(index + 1, index + text.length() - 1);

PS:在光标处插入文本,并选中##里面的文本

整理改编自: http://orgcent.com/android-edittext-cursor-position-focus/


设置EditText光标位置

转载请注明出处。

Android中有很多可编辑的弹出框,其中有些是让我们来修改其中的字符,这时光标位置定位在哪里呢?

刚刚解了一个bug是关于这个光标的位置的,似乎Android原生中这种情况是把光标定位到字符串的最前面。需求是将光标定位到字符的最后面。

修改的地方是TextView这个控件,因为EditText也是继承了TextView。在setText方法中有:

复制代码
 1  private void setText(CharSequence text, BufferType type,
 2                          boolean notifyBefore, int oldlen) {
 3 ……
 4         if (text instanceof Spannable) {
 5             Spannable sp = (Spannable) text;
 6 
 7             ……
 8             if (mMovement != null) {
 9                 mMovement.initialize(this, (Spannable) text);
10         //文本是不是Editable的。
11         if(this instanceof Editable)
12                      //设定光标位置
13                      Selection.setSelection((Spannable)text, text.length());
14 
15                ……
16     }
复制代码

从红色代码中可以看出,google是要光标处在缺省文本的末端,但是,log发现 (this instanceof Editable)非真,也就是说Selection.setSelection((Spannable)text, text.length());并不会被执行。

1    Log.d("TextView", "(type == BufferType.EDITABLE)="+(type == BufferType.EDITABLE));
2    if(type == BufferType.EDITABLE){
3          Log.d("TextView","Format text.Set cursor to the end ");
4          Selection.setSelection((Spannable)text, text.length());
5    }

这个样修改后即可。

 

在编写应用的时候,如果我们要将光标定位到某个位置,可以采用下面的方法:

1 CharSequence text = editText.getText();
2 //Debug.asserts(text instanceof Spannable);
3 if (text instanceof Spannable) {
4     Spannable spanText = (Spannable)text;
5     Selection.setSelection(spanText, text.length());
6 }

其中红色标记的代码为你想要设置的位置,此处是设置到文本末尾。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值