`
lx82319214
  • 浏览: 108378 次
  • 性别: Icon_minigender_1
  • 来自: 贵州
社区版块
存档分类
最新评论

EditText操作

 
阅读更多

Android开发:自由选择TextView的文字

2010-09-06 13:21 chroya Javaeye博客 我要评论(0 ) 字号:T | T
一键收藏,随时查看,分享好友!

本文将介绍一下在Android下自由选择TextView的文字。用过EditText的都知 道,EditText有个特点,ContextMenu提供了选择文字、复制、剪切等功能。如果直接就在view上选择文字,那样会更加方便。本文将教你 如何自由选择TextView的文字。

AD:

我们介绍过一系列Android开发的教程,比如《如何实现TCP和UDP传输 》、《在MyEclipse 8.6上搭建Android开发环境 》,今天我们来介绍一下在Android下自由选择TextView的文字。

51CTO推荐专题: Android开发应用详解

用过EditText的都知道,EditText有个特点,当在里面长按的时候,会出现一个ContextMenu,提供了选择文字、复制、剪切等 功能。如果不出现这个ContextMenu,直接就在view上选择文字,那样会更加方便。于是作者就研究了一下EditText和TextView的 代码,然后将这个问题解决了。

网上很多资料都说,要选择一段文字,只需要用Selection.getSelectionStart()和Selection.getSelectionEnd()确定选择的文字的头和尾,然后加颜色就行。作者经过测试,发现这个结果导致误导了很多人,是行不通的。

我们来分析一下解决办法。

TextView是很多View的基类,如Button、EditText都是继承自他,所以EditText里面的代码很少。我们看一下 EditText的源码,有一个Override的getDefaultEditable方法,看名字的意思是是否可编辑,这个方法直接返回true。还 有一个getDefaultMovementMethod方法,它返回的是ArrowKeyMovementMethod.getInstance(), 通过查看ArrowKeyMovementMethod的源码,基本确定这个方法就是弹出ContextMenu和轨迹球监听的“元凶”。

下面,我们自己做一个view来打造自己的EditText。

我取名TextPage,继承EditText,在里面覆盖getDefaultEditable和getDefaultMovementMethod。

Java代码

  1. @Override    
  2. public boolean getDefaultEditable() {    
  3.     return false;    
  4. }    
  5. @Override    
  6. protected MovementMethod getDefaultMovementMethod() {    
  7.     return null;    
  8. }   

现在测试一下,发现长按没反应了,所料不错,就是getDefaultMovementMethod方法控制了ContextMenu。

看一下ArrowKeyMovementMethod的代码,里面提供了KeyEvent、轨迹球事件onTrackballEvent和 touch事件onTouchEvent的处理。这些事件在何处调用的呢?我们看看TextView的onTouchEvent、 onTrackballEvent和onKeyEvent方法里面就明白了,在这些事件回调中调用了ArrowKeyMovementMethod里面的 这些方法。

还有个问题,ContextMenu在哪里触发的?这个问题,用过ContextMenu的都知道,view里面要使用ContextMenu,需 要覆盖一个onCreateContextMenu方法,然后在里面创建ContextMenu的各个选项。在TextView里面找 onCreateContextMenu,果然有,里面定义了选择、复制、粘贴等选项。

既然找到了这个,那么我们就可以进一步分析选择是如何做到的。

onCreateContextMenu只是创建菜单,那么菜单点击之后,触发了什么呢?

onCreateContextMenu里面定义了一个MenuHandler对象,然后作为参数传递给 setOnMenuItemClickListener,找到MenuHandler,发现里面的onMenuItemClick返回的是 onTextContextMenuItem函数,找到onTextContextMenuItem,OMG,终于找到点击menu触发的函数了。但是里 面貌似没有关键的东西,选择的部分不在这里。那么,就应该在上面所说的那些事件里面了。

重点分析ArrowKeyMovementMethod的onTouchEvent方法。发现一个重要的方法getLayout(),然后获取一个Layout对象,通过x和y坐标知道当前字符串的offset位置。

那么,问题就可以完美的解决了。你可以点击任何地方然后拖动,释放之后,中间的文字就会被选中。

Java代码

  1. import android.content.Context;    
  2. import android.graphics.Color;    
  3. import android.text.Layout;    
  4. import android.text.Selection;    
  5. import android.view.ContextMenu;    
  6. import android.view.Gravity;    
  7. import android.view.MotionEvent;    
  8. import android.widget.EditText;    
  9.     
  10. /**   
  11.  * @author chroya   
  12.  */    
  13. public class TextPage extends EditText {    
  14.     private int off; //字符串的偏移值    
  15.     
  16.     public TextPage(Context context) {    
  17.         super(context);    
  18.         initialize();    
  19.     }    
  20.     
  21.     private void initialize() {    
  22.         setGravity(Gravity.TOP);    
  23.         setBackgroundColor(Color.WHITE);    
  24.     }    
  25.         
  26.     @Override    
  27.     protected void onCreateContextMenu(ContextMenu menu) {    
  28.         //不做任何处理,为了阻止长按的时候弹出上下文菜单    
  29.     }    
  30.         
  31.     @Override    
  32.     public boolean getDefaultEditable() {    
  33.         return false;    
  34.     }    
  35.         
  36.     @Override    
  37.     public boolean onTouchEvent(MotionEvent event) {    
  38.         int  action  =  event .getAction();    
  39.         Layout  layout  =  getLayout ();    
  40.         int  line  =  0 ;    
  41.         switch(action) {    
  42.         case MotionEvent.ACTION_DOWN:    
  43.              line  =  layout .getLineForVertical(getScrollY()+ (int)event.getY());            
  44.              off  =  layout .getOffsetForHorizontal(line, (int)event.getX());    
  45.             Selection.setSelection(getEditableText(), off);    
  46.             break;    
  47.         case MotionEvent.ACTION_MOVE:    
  48.         case MotionEvent.ACTION_UP:    
  49.              line  =  layout .getLineForVertical(getScrollY()+(int)event.getY());     
  50.             int  curOff  =  layout .getOffsetForHorizontal(line, (int)event.getX());                
  51.             Selection.setSelection(getEditableText(), off, curOff);    
  52.             break;    
  53.         }    
  54.         return true;    
  55.     }    
  56. }    

//EditTextEx.setMagnifierVisible(boolean visible); 可以不用放大镜。

//EditTextEx.setOptionsVisible(boolean visible); 可以不用复制粘贴栏。

    分享到:
    评论

    相关推荐

      EditText焦点的自动跳转

      `OnKeyListener`可以在特定按键按下时执行操作。例如,当用户在软键盘上按下回车键时,我们可以将焦点转移到下一个`EditText`。 ```java editText1.setOnKeyListener(new View.OnKeyListener() { @Override ...

      Android编程之EditText常见操作示例

      接下来,我们将深入探讨这些常见的EditText操作。 1. 获取光标选中的文字 当用户在EditText中选择了一段文字后,我们可能需要获取这部分被选中的内容。可以通过以下方式实现: ```java EditText view = (EditText)...

      EditText监听输入完成

      在许多场景下,我们可能需要监听用户在`EditText`中的输入行为,特别是在用户完成输入后执行某些操作,比如验证输入内容、提交表单或者进行其他业务逻辑处理。本文将详细介绍如何在Android应用中实现`EditText`的...

      android的EditText的使用

      通过监听`EditText`的焦点变化和文本变化,我们可以根据用户输入进行相应的操作,如计算实际支付金额。在AutoChangeDemo示例中,这种功能提高了应用的互动性和用户体验。记住,始终关注用户体验和数据验证,确保应用...

      自定义editText

      通过这样的自定义,不仅可以提升用户体验,使用户能更便捷地操作,还可以减少代码重复,提高代码复用性。对于开发者来说,自定义控件是实现业务逻辑和UI设计需求的重要手段,也是提高开发效率的关键。 在实际应用中...

      多个EditText 连续输入密码框

      在编写代码时,需要注意处理边界情况,比如最后一个`EditText`失去焦点后应如何操作,以及如何确保输入的格式正确。同时,为了适配不同设备和用户习惯,可能还需要进行一些自适应布局和键盘行为的调整。

      Android 监听EditText变化

      `TextWatcher`是一个接口,提供了三个方法,帮助我们监控`EditText`中文字的添加、删除和替换操作。下面我们将详细探讨`EditText`变化监听及其相关知识点。 1. **TextWatcher接口** `TextWatcher`接口包含三个方法...

      自定义牛逼的EditText特效输入框

      在Android开发中,UI设计是用户体验的关键因素之一,而EditText作为用户输入数据的重要组件,其设计和交互方式直接影响到用户的操作感受。本项目名为“自定义牛逼的EditText特效输入框”,显然,它旨在提供一种独特...

      EditText控件内右侧加图片,图片实现点击事件处理

      总结,要在`EditText`控件内右侧添加图片并实现点击事件处理,主要步骤包括:在XML布局文件中创建`EditText`和`ImageView`,设置`ImageView`的点击事件监听器,在监听器的回调中执行相应的操作,例如清除`EditText`...

      EditTextSearch

      而“EditTextSearch”这个主题则涉及到如何实时监控`EditText`中的输入内容,并根据这些输入进行数据的搜索和筛选操作。这一过程对于实现用户友好的搜索功能至关重要,尤其是在大数据集的应用场景下,比如在线购物...

      安卓EditText输入框相关-material风格的edittext效果很不错。.rar

      10. **键盘控制**:`android:imeOptions`和`android:inputType`结合可以控制软键盘的行为,如关闭键盘、执行特定操作等。 以上是Material Design风格EditText的一些关键特征和配置。在实际应用中,可能需要根据具体...

      editText右边带删除按钮

      在Android开发中,`EditText` 是一个非常常见的控件,用于接收用户输入的文字信息。然而,iOS系统的输入框常常带有...在实际项目中,可以根据需求进行定制,例如调整图标的样式、颜色,或者改变触发清除操作的条件。

      不一样的EditText

      在用户点击或者聚焦到这个EditText时,组件可能会有微妙的动画反馈,比如边界轻微的弹性抖动,这可以增加用户操作的趣味性,同时也能通过视觉反馈确认用户的操作已被系统识别。 在登录注册界面,用户体验是至关重要...

      Android EditText 仿软键盘删除按钮实现

      通过为`EditText`设置`OnLongClickListener`,我们可以在用户长按时启动一个定时任务来执行删除操作: ```java editText.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean ...

      可以显示gif图片的Edittext

      7. **优化性能**:考虑到GIF播放可能会消耗较多CPU资源,特别是在旧设备上,我们可能需要添加一些优化措施,比如限制GIF的播放速度,或者在用户未操作时自动暂停GIF。 通过以上步骤,我们就成功地在EditText中实现...

      Android代码-EditText的撤销和恢复

      EditText的撤销和恢复撤销操作 使用 引入库 compile 'ren.qinc.edit:lib:0.0.5' 初始化 mEditText = ((EditText) findViewById(R.id.editText)); //创建PerformEdit,一定要传入不为空的EditText ...

      完美解决recyclerview item上面包含多个edittext导致数据错乱,和滑动卡顿问题

      这主要是因为EditText的焦点获取、文本输入监听和布局重绘等操作在滚动时会继续执行。为优化此问题,可以采取以下策略: - 使用`android:descendantFocusability="blocksDescendants"`属性阻止子View(如EditText...

      安卓EditText输入框相关-edittext失去焦点收起键盘.rar

      在Android开发中,...以上知识点涵盖了EditText焦点管理和键盘控制的常见操作,实际应用中可能还需要结合具体业务逻辑进行调整。在学习和使用这些代码时,理解其背后的原理并进行适当的修改和优化是非常重要的。

      Edittext动画

      当 `EditText` 正在执行如网络请求的操作时,可以添加一个加载指示器动画,提示用户正在处理数据。 8. **状态变化动画**: 对于错误验证或成功提示,可以设计相应的动画,如错误提示时 `EditText` 边框变红,成功...

      EditText控件使用

      本教程将深入探讨`EditText`的基础使用,包括XML布局中的配置以及在Java代码中对它的操作。 首先,让我们了解`EditText`在XML布局文件中的基本配置。`EditText`继承自`TextView`,可以接受用户输入的文字。在XML...

    Global site tag (gtag.js) - Google Analytics