android的TextView的TextWatcher使用

2025年最新雷电模拟器9.22安装Magisk面具和LSPosed框架完整图文教程 文章末尾附所需软件下载 操作环境:雷电模拟器9.0.22 虚拟系统版本android 91、设置-其他设置-Root权限-开启2、设置-性能设置-System.vmdk可写入3、安装Magisk-18a0b94a-delta(25205).apk,运行并给予root权限4、选择右上角安装弹出“允许“magisk Delta”访问您设备上的照片、媒体内容和文件吗?“选择允许,然后结束magisk进程。5、从新运行magisk选择右上角安装-选择修补boot镜像中的vbmeta和安装到Recovery。 阅读详情
TextWatcher是一个文本变化监听接口,定义了三个接口,分别是beforeTextChanged,onTextChanged,afterTextCahnged.
TextWatcher通常与TextView结合使用,以便在文本变化的不同时机做响应的处理。TextWatcher中三个回调接口都是使用了InputFilter过滤器过滤之后的文字字符作为新的字符对象。
使用方法

mTextView.addTextChangedListener(new TextWatcher(){
@Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) { //屏蔽回车 中英文空格

        }
});

我们可以在beforeTextChanged,onTextChanged,afterTextChanged的回调方法中实现自己的业务逻辑,这三个参数代表了TextView文本发生变化的三个阶段。

beforeTextChanged(CharSequence s, int start, int count, int after)方法是TextView在文本改变之前调用,并且传入四个参数。
CharSequence s参数表示当前TextView内部的mText成员变量,实际上就是当前显示的文本;
int start参数表示需要改变的文字区域的起点,即选中的文本区域的起始点;
int count参数表示需要改变的文字的字符数目,即选中的文本区域的字符的数目;
int after参数表示替换的文字的字符数目。
特别的,当TextView删除文本的时候,after的值为0,此时TextView使用用空字符串代替需要改变的文字区域来达到删除文字的目的。
图1.1描述了beforeTextChanged的四个参数的含义。
图1.1 beforeTextChanged的四个参数实例


TextView的setText方法通过调用sendBeforeTextChanged方法通知所有注册的TextWatcher回调beforeTextChanged方法,此时传入的四个参数,s是当前的本地变量mText的值,如果该值为null,即之前没有给TextView设置过需要显示的文本,那么s的值为"";start的值为0;count的值为当前mText的长度;after的值为需要显示的新文本的长度。代码1.1是TextView中setText方法调用sendBeforeTextChanged的源码。
代码1.1 TextView中setText方法调用sendBeforeTextChanged的源码
if (mText != null) {
    oldlen = mText.length();
    sendBeforeTextChanged(mText, 0, oldlen, text.length());
} else {
    sendBeforeTextChanged("", 0, 0, text.length());
}

onTextChanged(CharSequence s, int start, int before, int count)方法是TextView在文本改变的时候调用,此时mText成员变量已经被修改为新的文本,并且传入四个参数。
CharSequence s参数表示当前TextView内部的mText成员变量,此时的mText已经被修改过了,但此时mText所表示的文本还没有被显示到UI组件上;
int start参数表示改变的文字区域的起点;
int before参数表示改变的文字区域在改变前的旧的文本长度,即选中文字区域的文本长度;
int after参数表示改变的文字区域在修改后的新的文本长度。
特别的,当TextView添加文本的时候,before 的值为0,此时相当于TextView将空的字符区域用新的文本代替。

afterTextChanged(Editable s)方法是TextView在调用完所有已注册的TextWatcher的onTextChanged方法之后回调的。此时mText成员变量已经被修改为新的文本,并且传入s,该参数s实际上就是mText。通过该接口,咱们可以再次修改将要展示的文字。
图1.2描述了这三个方法在TextView文字变化时的调用流程。
图1.2  TextView文字变化时的调用流程


afterTextChanged的参数类型是Editable,这是一个可编辑的对象,该对像就Textview的内部变量mText,此时的mText是·可编辑的,实际上是一个SpannableStringBuilder对象。代码1.1是TextView的setText方法中text的转换逻辑。从代码中可以看出,当type == BufferType.EDITABLE || getKeyListener() != null || needEditableForNotification为true的时候,mEditableFactory会调用newEditable的方法创建一个可编辑的对象SpannableStringBuilder。
代码  1.1  TextView的setText方法中text的转换逻辑
boolean needEditableForNotification = false;

if (mListeners != null && mListeners.size() != 0) {
    needEditableForNotification = true;
}

if (type == BufferType.EDITABLE || getKeyListener() != null ||
        needEditableForNotification) {
    createEditorIfNeeded();
    Editable t = mEditableFactory.newEditable(text);
    text = t;
    setFilters(t, mFilters);
    InputMethodManager imm = InputMethodManager.peekInstance();
    if (imm != null) imm.restartInput(this);
} else if (type == BufferType.SPANNABLE || mMovement != null) {
    text = mSpannableFactory.newSpannable(text);
} else if (!(text instanceof CharWrapper)) {
    text = TextUtils.stringOrSpannedString(text);
}
                                                                  
代码1.2是mEditableFactory的newEditable方法,该方法是一个工厂方法,创建一个 SpannableStringBuilder对象。
代码  1.2  mEditableFactory的newEditable方法
public Editable newEditable(CharSequence source) {
    return new SpannableStringBuilder(source);
}

SpannableStringBuilder实现了CharSequence, GetChars, Spannable, Editable,Appendable, GraphicsOperations的接口,内部的string是可以变化的。不过咱们修改afterTextChanged 中的参数s的时候,需要注意循环调用的潜在风险,因为SpannableStringBuilder会在自己内部保存TextView的mChangeWatcher对象,代码1.3描述了设置过程。如代码所示,text通过setSpan方法添加了mChangeWatcher对象,以监听整个text的变化,并且做回调。当text的内容发生变化的时候,会通过span机制调用mChangeWatcher中的相应方法。
代码1.3 TextView的setText方法给mText添加mChangeWatcher的源码
Spannable sp = (Spannable) text;

// Remove any ChangeWatchers that might have come from other TextViews.
final ChangeWatcher[] watchers = sp.getSpans(0, sp.length(), ChangeWatcher.class);
final int count = watchers.length;
for (int i = 0; i < count; i++) {
    sp.removeSpan(watchers[i]);
}

if (mChangeWatcher == null) mChangeWatcher = new ChangeWatcher();

sp.setSpan(mChangeWatcher, 0, textLength, Spanned.SPAN_INCLUSIVE_INCLUSIVE |
        (CHANGE_WATCHER_PRIORITY << Spanned.SPAN_PRIORITY_SHIFT));

mChangeWatcher是一个ChangeWatcher对象,ChangeWatcher是TextView的内部类,实现了TextWatcher, SpanWatcher接口偶,代码1.4描述了ChangeWatcher实现的TextWatcher的三个回调接口。这三个接口会分别调用TextView的相应的方法,通知所有注册的TextWatcher的调用相应的三个回调接口。其中,TextView的handleTextChanged还会调用invalidate()和checkForResize()方法重绘UI界面.
代码1.4 ChangeWatcher实现的TextWatcher的三个回调接口
public void beforeTextChanged(CharSequence buffer, int start,
                              int before, int after) {
    .......

    TextView.this.sendBeforeTextChanged(buffer, start, before, after);
}

public void onTextChanged(CharSequence buffer, int start, int before, int after) {
    .......
    TextView.this.handleTextChanged(buffer, start, before, after);
    ......
}

public void afterTextChanged(Editable buffer) {
    ......
    TextView.this.sendAfterTextChanged(buffer);
    ......
}

通过SpannableStringBuilder,ChangeWatcher这两个类再加上span机制,android可以在文本改变的时候通知所有注册的TextWatcher方法调用相应的三个接口。但是这又会使咱们在TextWatcher的afterTextChanged中修改参数s的时候,再次调用TextWatcher的三个回调接口,这样如果afterTextChanged不能因为某些条件的判断,终止对s的修改,那么就会形成无限循环调用。
类似TextView的setText的方法也会在相应的时机通知所有注册的TextWatcher调用响应的三个接口,如果咱们在TextWatcher的三个接口中调用TextView的setText方法也会导致无限循环调用。图1.3描述了无限调用的示例。

图1.3 无限调用示例


但是有时候我们可能需要根据业务需求更改显示的文本,比如过滤不必要的字符,过滤非法的文字,添加必要的结束字符等。这个时候我们有时候会给TextView添加一个TextWatcher,然后在某个接口回调中根据传入的参数修改将要显示的文本,这可以满足咱们的业务需求,不过有可能会导致无限循环调用。针对这个问题,咱们可以通过InputFilter来完成修改文本的目的。
InputFilter是一个接口,内部定义了filter方法,这个方法的作用是修改传入的字符串,如果返回值为null,那么保持原来的字符串。代码1.5是这个方法的定义。
代码1.5 InputFilter内部定义了filter接口
public CharSequence filter(CharSequence source, int start, int end,
                           Spanned dest, int dstart, int dend);

如代码所示,filter方法需要传入六个参数,其中
source参数是即将替换选中字符区域的字符串对象;
start参数表示source的起始位置;
end参数表示source的终止位置。通过source,start,end这三个参数可以描述出替换选中字符区域的新的字符串。
dest表示选中文字区域的文本对象,TextView的setText方法调用filter方法时,传入的dest为EMPTY_SPANNED,修改文字时,传入的
       dest为TextView中保存的mText;
dstart表示选中的文字区域的起始位置;
dend表示选中的文字区域的终止位置。
该方法的返回值是用来替换source作为新的替换文本。
图1.4是有一个filter实例,描述了filter的六个参数的含义。
图1.4 filter实例
 
InputFilter接口内部提供了两个子类,分别是AllCaps和LengthFilter。
AllCaps是将文本中的小写字符全部转为大写字符的过滤器,通过该过滤器,TextView能将输入文本中的小写字符转为大写字符,然后显示出来;
LengthFilter是删除掉超过长度maxLength的字符的过滤器。在xml中配置了maxLength之后,TextView在创建实例的时候,会生成一个LengthFilter的过滤器,以便达到限定显示字符长度的功能。

咱们自己也可以定义满足咱们业务需求的inputfilter,以达到在TextWatcher接口回调之前过滤掉无用或者非法字符的功能,代码1.6是一个InputFilter的实现子类,该类过滤掉无用的空白符。
代码1.6 过滤掉无用空白符的过滤器
static class NoUsageCharInputFilter implements InputFilter {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        return source == null ? null : source.toString().replaceAll("\\s", "");
    }
}

定义完InputFilter的实现子类之后,咱们就可以将实现了的过滤器添加到TextView的过滤器数组中,代码1.7是一个添加过滤器的示例,如代码所示,通过source.setFilters(inputFilters)方法可以给TextView设置InputFilter数组,由于我们的功能是添加过滤器,因此需要将source原本的过滤器数组中的元素添加到新的过滤器数组中,否则source原本的过滤器数组会被覆盖掉,那样即使咱们在xml文件中配置了maxLength,source也不会使用LengthInputFilter来限定文本的长度。
代码1.7  添加过滤器的示例
public static void addNoUsageCharInputFilter(TextView source) {
    if (source == null)
        return;

    InputFilter[] inputFilters = new InputFilter[source.getFilters() != null ? source.getFilters().length + 1: 1];
    inputFilters[0] = new NoUsageCharInputFilter();
    if (source.getFilters() != null) {
        for (int i = 0; i < source.getFilters().length; i++)
            inputFilters[i + 1] = source.getFilters()[i];
    }

    source.setFilters(inputFilters);
}

TexView在设置完过滤器数组之后,它的setText方法会在调用sendBeforeTextChanged之前先用过滤器数组中的过滤器修改传入的文本参数,setText方法调用过滤器的实现见代码1.8。
代码1.8 TexView中setText调用过滤器的实现代码
int n = mFilters.length;
for (int i = 0; i < n; i++) {
    CharSequence out = mFilters[i].filter(text, 0, text.length(), EMPTY_SPANNED, 0, 0);
    if (out != null) {
        text = out;
    }
}

if (notifyBefore) {
    if (mText != null) {
        oldlen = mText.length();
        sendBeforeTextChanged(mText, 0, oldlen, text.length());
    } else {
        sendBeforeTextChanged("", 0, 0, text.length());
    }
}

通过以上的分析:
1.咱们可以使用TextWatcher监听TextView文本变化的三个时机,并在回调函数中做相应的处理;
2.但是在回调函数中处理业务的时候,需要注意不要调用该TextView的setText方法,否则会发生无限循环调用;
3.在TextWatcher 的回调接口afterTextChanged方法中修改参数s的时候,也要注意在修改了s之后,会触发文本变化,导致TextView中所有注册的TextWatcher再次回调自己的的三个回调函数,此时需要预防无限循环调用的发生。
4.如果需要修改传入文本,那么可以实现InputFilter接口,然后给TextView添加符合业务需求的过滤器;
5.给TextView添加自定义的过滤器的时候,需要注意使用setFilter方法设置过滤器会覆盖掉TextView原本的过滤器,如果不想舍弃TextView原本的过滤器,那么需要将原本的过滤器添加到新的过滤器数组中。
6.TextView使用InputFilter过滤器数组的时候,是从第一个过滤器到最后一个过滤器依次使用的,因此咱们给TextView设置过滤器数组的时候需要考虑过滤器的顺序。





安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案 本文主要介绍了安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 阅读详情

相关推荐

鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结

1、算法说明经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。经过P点的入射光线没有透镜的话,本应交于相机成像平面的e点。然而,经过鱼眼相机的折射,光线会交于相机成像平面的d点,就产生了畸变,因此畸变图像整体上呈现出像素朝图像中心点聚集的态势。而去畸变,就是将折射到d点的点,重新映射回到e点,因此去畸变之后的图像与原始的鱼眼图像相比,仿佛是把向心聚集的像素又重新向四周铺展开来。AVM环视系统——鱼眼相机去畸变算法 - 知乎。

大胡子大叔的专栏 2万+

Android开发学习日记--焦点变更监听器和文本变化监听器

一、效果展示 xml代码: java代码: 2.设置文本变化监听器 输入法的软键盘往往会遮住页面下半部分,使得“登录”“确认”“下一步”等按钮看不到了,用户若想点击这 些按钮还得再点一次返回键才能关闭软键盘。为了方便用户操作,最好在满足特定条件时自动关闭软键 盘,比如手机号码输入满11位后自动关闭软键盘,又如密码输入满6位后自动关闭软键盘,等等。达到指定位数便自动关闭键盘的功能,可以再分解为两个独立的功能点,一个是如何关闭软键盘,另一个是 如何判断已输入的文字达到指定位数。 首先写

m0_52238102的博客 2692

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2565

Android 安卓DataBinding(七)·事件绑定

文章目录 前景回顾 事件绑定 整体思路 拓展 运行效果 前景回顾 Android 安卓DataBinding(一)·基础 Android 安卓DataBinding(二)·入门 Android 安卓DataBinding(三)·单向绑定 BaseObservable Android 安卓DataBinding(四)·单向绑定 ObservableField Android 安卓DataBinding(五)·单向绑定 ObservableCollection(集合使用) Android 安卓DataBindi

chuyouyinghe的专栏 812

昇腾910安装驱动出错,降低Centos7.6的内核版本

Centos7.6 启动内核修改,解决昇腾910安装驱动错误的问题。

深蓝 3300

HyperMesh实战:5种复杂载荷场景下的field映射技巧(附TCL脚本)

本文详细介绍了HyperMesh在5种复杂载荷场景下的field映射技巧,包括轴承载荷的圆柱坐标系映射、粉末压力中的切向力处理、实验数据到有限元模型的场映射、多工况载荷的组合映射以及局部细化网格的边界条件传递。通过实战案例和TCL脚本,帮助工程师高效解决有限元分析中的载荷映射难题,提升工作效率。

fanta的博客 294

android 更改edittext内容,Android如何实时更改edittext的内容

为此使用TextWatcher。设置它的EditText用户类型:myEditText1.addTextChangedListener(new TextWatcher() {@Overridepublic void afterTextChanged(Editable s) {String value = s.toString();// Perform computations using this...

weixin_28704675的博客 1512

hive sql每个用户的累积访问次数

我们有如下的用户访问数据 userId visitDate visitCount u01 2017/1/21 5 u02 2017/1/23 6 u03 2017/1/22 8 u04 2017/1/20 3 u01 2017/1/23 6 u01 2017/2/21 8 U02 2017/1/23 6 U01 2017/2/22 4 要求使用SQL...

weixin_39150719的博客 3480

安卓beforetextchanged_Android TextWatcher.afterTextChanged与TextWatcher

公共无效afterTextChanged(Editable s)调用此方法来通知您,s文本中的某处已更改。s从此回调进行进一步更改是合理的,但请注意不要陷入无限循环,因为您进行的任何更改都将导致递归再次调用此方法。(你是不是说当变化发生,因为其他afterTextChanged()方法可能已经做了修改和无效的偏移量。但是,如果你需要知道这里,你可以使用setSpan(Object, int, in...

weixin_29879257的博客 764

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

本文介绍了如何将C#游戏开发中的代码从单个.cs文件拆分到多个.cs文件中,以提升代码的可维护性和可读性。文章演示了在Visual Studio中创建Hero类和ShowInfo类的具体步骤:通过右键项目名添加新建类,将原有代码分别剪切到对应的类文件中,并自动生成命名空间。拆分后需要在Program.cs中通过"using"指令引用这些类,最后通过运行测试验证功能正常。这种模块化代码组织方式能有效解决单一文件代码过长、结构混乱的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1136

10、数据挖掘与轨迹生成技术:FSSEMiner与CondTraj - GAN的探索

本文介绍了两种先进的数据处理技术:FSSEMiner算法用于从动态属性图中挖掘频繁顺序子图演化模式,揭示如交通流和疾病传播等复杂系统的演化规律;CondTraj-GAN是一种端到端的条件生成对抗网络,能够生成高质量的合成车辆轨迹,解决真实轨迹数据因隐私问题难以获取的挑战。通过实验评估与真实数据集验证,两种技术在可扩展性、实用性及生成质量方面均表现出色,并在交通管理、城市规划、自动驾驶研发等领域具有广泛应用前景。

grafana8visual的博客 87

android设置4个字符,java – Android afterTextChanged不会在每4个字符后输入一个空格...

我正在尝试设计一个简单的信用卡/借记卡表单.我有一个cardNumber EditText字段.当用户开始输入时,我希望我的应用程序在每4个数字后插入一个空格.我从this教程中获得了帮助并进行了一些修改,但它没有用.每4位数后它不会进入空格.MainActivity.javapackage *************************import android.content.pm.Ac...

weixin_32818365的博客 352

【AI智能体】Codex 基于Git 实现项目管理实战操作详解

Codex 基于Git 实现项目管理实战操作详解

congge 5454

Android TextWatcher监控EditText,TextView

布局中EditText在android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去观察输入框中输入的内容,作个笔记。 主布局: xml version="1.0" encoding="utf-8"?> LinearLayout xmlns:android="http://schemas.android.com/apk/res

heng615975867的专栏 4818

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

android textwatcher 获取当前控件,使用TextWatcher实现EditText与TextView同步

我们看过很多例子介绍了EditText与TextView同步的方法,都是通过让EditText控件添加按键监听器来实现,在监听器中让TextView中的值显示为EditText中输入的内容,从而实现了基本的同步功能,大致的实现方法如下:editText.setOnKeyListener(new EditText.OnClickListener(){public boolean onKey(View...

weixin_39669265的博客 399

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android EditText TextWatcher应用实例

Android TextWatcher应用实例  (2012-02-21 15:52:12) 转载▼ 标签:  android   textwatcher   杂谈 分类: 手机世界 (1)使用TextWathcer限制输入字符个数 布局中EditText在android布局中经常用到,对EditText中输入的

liu_jia_guo的专栏 1263

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android 根据EditText 内容,改变TextView显示

TextView msgTheme=(TextView) this.findViewById(R.id.msgTheme); EditText editMeetingTopic = (EditText) this.findViewById(R.id.meetingTopic); editMeetingTopic.addTextChangedListener(new TextWatcher() {

fengdeqixi_007的专栏 1664

RxTextView、TextWatcher监听EditText、TextView,实现Android流行用户交互

举例:用户登录界面,通常的用户交互是:用户输入全部内容,点击“登录”,后台校验数据,返回结果。 进一步的体验:会对EditText的输入内容进行正则表达式,点击“登录”时,进行校验数据是否符合正则表达式,符合了再传数据到后台,不符合时弹出Toast进行提示。 更优的用户体验是什么呢? 我目前能想到的是:如下图所示,实时监听EditText,对输入的内容一直监听着,当两个EditText(也可...

weixin_40420578的博客 1814

Android TextWatcher应用实例

(1)使用TextWathcer限制输入字符个数布局中EditText在android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去观察输入框中输入的内容来限制输入字符个数。 主布局: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:androi...

weixin_34013044的博客 135

android TextWatcher 监听textview和edittext的文字输入改变

editText1.addTextChangedListener(watcher); TextWatcher watcher = new TextWatcher() {     public void afterTextChanged(Editable s) {         setLeftWord();     }     public void beforeTextChan

蚁人日记 2881

TextWatcher实现EditText与TextView同步

TextWatcher自身是一个接口,首先需要实现这个接口并覆盖其三个方法,分别为Text改变之前,改变之后以及改变的过程中各自发生的动作相应,这里我们只需要实现EditText在文本发生改变时候让TextView的内容跟着发生变化。 edText.addTextChangedListener(new TextWatcher() { @Overr

tony_chen的专栏 3638

Android 动态添加textView或EditText,并获取输入数据

Android 动态添加textView或EditText,并获取输入数据 menglongma 问题引入 Android开发中往往需要动态创建诺干个同类控件,或对他们设置点击事件或批量获取他们的值,下面提供我在开发中所使用的一种参考。 动态创建多个textView,这里描述一个页面取名为:test.xml,现在在Id为MyTable的控件里插入多个textview控件 <?xml version="1.0" encoding="utf-8"?> <Linear.

cxu123321的博客 3853

Android封装TextView内容伸缩工具

相信大家经常看见下面的实现效果: 如果想要实现上面的效果,那么就要分下面几步: 1、判断文字内容有没有超过指定行数的高度,如果超过了显示伸展箭头,如果没超过则隐藏箭头; 2、对箭头进行监听,如果是伸展状态,则变为收缩状态;如果是收缩状态,则变为伸展状态; 3、根据文本控件的状态动态改变箭头的图标; 4、当文本内容发送改变时,依然能完美适配上述功能。 虽然

HyperionChen 1273
上一篇: 网易笔试题,实现一个hashtable,使得他的set,get,setAll时间复杂度都是O()
下一篇: activity的生命周期
LuckySort
博客等级 码龄17年 1粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值