它不能在头部和尾部扩展Span的范围,只允许中间插入。同时,当Span覆盖的文本被删除时,Span也会被删除。也就是说,它天生具有一定数据安全可靠的属性。这会为我们省掉很多事情。...这个需求又产生了两个问题: 1)当普通文本发生变化后,如何监控一个Span起始位置发生变化? 2)如何禁止Span内部插入光标? 对于第一个问题,我在网上看到过一种思路。...有三种做法: 1)普通文本,当标签文本被破坏(删除、插入、追加文本)时,让绑定的数据失效,这就是微信的做法; 2)普通文本,把标签文本作为一个整体,不能对标签内部插入光标,杜绝数据被破坏的情况,这是微博的做法...也就是说,我们可以通过SpanWatcher侦听光标活动,通过Selection实现当光标移动到Span内部时,让它重新移动到Span最近的边缘位置,Span内部永远无法插入光标。...Editable.Factory的注释让我看到了希望。他可以被重写,并被重新注入EditText。
那么再次启动这个Activity的时候EditText的数据又得重新输入,这是极大的影响用户的体验的。那么我们该如何解决这个问题呢。...我们可以把它理解为当Activity要被摧毁时,onSaveInstanceState(Bundle b)方法被调用,将数据保存在Bundle对象中,并且储存在应用程序的某个角落(内存)中,当这个Activity...被重新创建时,这个数据传入onCreate(Bundle savedInstanceSatte) 中。...MainActivity先被摧毁,然后被创建。 MainACtivity中的EditText开始时的状态为什么也没有: ?...我们发现即使MainActivity经历了先被摧毁,然后被创建的过程,但是其中的EditText控件中的信息并没有丢失。 Ok,任务完成。
设置文本选中内容加粗模式,代码如下所示,可以看到这里只需要传递一个lastFocusEdit对象即可,这个对象是最近被聚焦的EditText。...同时设置span,有许多类似的地方,考虑到后期的添加和移除,如何封装能够提高代码的扩展性。...stateAlwaysHidden-总是隐藏状态:当设置该状态时,软键盘总是被隐藏,和stateHidden不同的是,当我们跳转到下个界面,如果下个页面的软键盘是显示的,而我们再次回来的时候,软键盘就会隐藏起来...stateVisible-可见状态:当设置为这个状态时,软键盘总是可见的,即使在界面上没有输入框的情况下也可以强制弹出来出来。...当父布局是scrollView的时候,感觉没啥变化,还是自定将布局顶起,输入框不被遮挡,不可以手动滑出被遮挡的布局(白瞎了scrollView); 看了上面的属性,那么该如何设置呢?
RxBinding 是一组开源库,它允许你以RxJava的形式来处理UI事件。让我们来看一个小小的例子。...下面我们来看看如何用RxBinding完全实现TextWatcher。...当RxView.scrollChangeEvents() observable被subscribed时,该ViewScrollChangeEvent将作为onNext方法的参数。...RxBinding对不同平台的类没有局限。这里的RxBinding库对Android支持库也有效。...例如: compile 'com.jakewharton.rxbinding:rxbinding-kotlin:0.4.0' 扩展你的RxJava工具箱 如果你还没有开始RxJava之旅,RxBinding
主要属性就是android:imeOptions和android:imeActionLabel 但是android:imeActionLabel属性有的输入法没做,所以就没有效果,但是在模拟器上看得出来...注意:看到其他的博客上写的都是用的android:singleLine="true"(因为默认是多行模式,而右下角的按键是用于换行的,当设置为单行模式后就没必要换行了) 但是这个方法文档显示已经废弃了...关于singleLine:@deprecated不推荐使用此属性 格式:boolean 将文本约束为单个水平滚动线,而不是让它包裹在多行上,并在按Enter键时提前聚焦而不是插入换行符。...--imeActionLabel属性有的输入法没做,所以就没有效果,但是在模拟器上看得出来,具体根据输入法会有不同结果--> <EditText android:id="@+id...editText0, editText1, editText2, editText3, editText4, editText5, editText6, editText7, editText8;
如果你没有看到任何内容被列出,你需要使用安卓SDK manager去安装一些。...下面演示了 你如何在 元素内定义它: EditText android:id="@+id/edit_message" android:layout_width="wrap_content...为了在下一个 activity去查询这个扩展数据,你应该使用常量为intent的这个扩展数据定义一个key。...当创建一个新的activity的实例时系统将会调用它。这个方法是 你必须使用setContentView()方法定义activity布局的地方,也是 你处理初始化设置那些activity组件的地方。...当它打开时,在文本框输入一个消息,点击发送,这时消息出现在第二个activity。 图表2 。 在最终的应用程序里的两个activity,运行在安卓4.4 这就是了,你完成构建里你的第一个安卓应用!
我把主activity命名为LoginActivity,它的布局文件命名为activity_login.xml。...一个单一的EditText 在输入文字的时候会隐藏hint,而被包含在TextInputLayout中的EditText则会让hint变成一个在EditText上方的浮动标签。...当然,EditText的hint会表现的跟预期一致。但是没有material动画也没有浮动标签。为什么会这样?我们还缺少一些代码。...现在我们定义了什么是错误的什么是正确的,也知道了如何获取EditText中的数据以及显示可能的错误,onClick方法的实现就很简单了。...设计范例中,控件的实现需要让用户在输入的过程中不会丢失上下文信息,它是在去年跟Material Design一起被谷歌介绍的。在这之前,没有让开发者将这个控件应用到实际项目中的支持库。
它们实现都是通过系统的InputMethodManager类去做的扩展。安装第三方输入法的手机,可以在设置–高级设置-语言和输入法中找到。—-系统级别的输入法 那么有没有app级别的输入法扩展呢?...二需求 我们如何能封装一个没有耦合性的自定义键盘,笔者能想到的需求如下: 动态添加到任何布局中 解决和系统键盘显示冲突 动态绑定系统输入框 有show和hide动画,让键盘显示更加优雅 没有耦合,使用方便...然后对应的页面清单文件设置 android:windowSoftInputMode="stateHidden|stateUnchanged"复制代码 让系统键盘不弹出来 3.3动态绑定输入框 系统的输入框是当EditText...因为焦点没有改变。这就需要我们在我们传递过来的布局文件中添加一个宽高是0的EditText。让用户点击完成的时候,这个EditText获取焦点。...3.7键盘遮挡 这里就需要首先判断是否已经被遮挡,如果被遮挡,需要算出来整个布局需要移动多少,当然键盘布局不能移动。移动方式可以通过属性动画或者scrollBy方法。这里我选择属性动画。
但是Theme.AppCompat 并没有实现谷歌官方应用中用到的每个material组建。其中一个重要的特性就是AppCompat theme没有提供一个显示在EditText上方的浮动标签。...它简直就是为解决这个问题而生的。本博文将演示如何使用Design Support Library中的TextInputLayout控件。 ---- 官方API ---- 运行效果 ?...一个单一的EditText 在输入文字的时候会隐藏hint,而被包含在TextInputLayout中的EditText则会让hint变成一个在EditText上方的浮动标签。...现在我们定义了什么是错误的什么是正确的,也知道了如何获取EditText中的数据以及显示可能的错误,onClick方法的实现就很简单了。...设计范例中,控件的实现需要让用户在输入的过程中不会丢失上下文信息,它是在去年跟Material Design一起被谷歌介绍的。在这之前,没有让开发者将这个控件应用到实际项目中的支持库。
当用户短暂离开APP时,如有必要,要能够把当前用户的数据记录下来。 当屏幕切换竖屏横屏时,不要导致APP崩溃以及用户数据的丢失。...只要当前activity的一部分视图能被用户看见,但用户的操作不聚焦在当前activity上,便会发生状态转移。 ?...Note: 当activity进入paused状态后,它之前所初始化的组件信息是存储在内存中的,并不会消失,因此也无需在onResume()方法中重新进行初始化。...app进入stopped状态后,用户长时间并没有唤醒app,系统清理内存时,自动关闭它。...当程序app启动时,自动加载系统的实例状态,呈现在用户面前。前面提到的editText中的文本信息的留存,便是最好的例证。
为什么EditText可以点击弹出keyboard,而TextView却不可以,EditText继承TextView做了哪些修改呢?...刚开始,我尝试了给listview设置clickListener,设置onScrollListener,重写它的onTouchEvent方法,但是发现并不能达到自己满意的效果(发现code有段时间了,自己都有种修改代码不修改自己满意为止不罢休的纠结感...(PS:之前也纠结过这个问题,adjustResize属性导致底部的Edit没有跟着keyboard移动,而是等keyboard打开后Edit在layout到合适的位置了。...View还有个监听getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener()这个监听方法被调用的时机据我测试时在上面监听之后回调的...so当一步步根据自己的调试终于达到自己的满意了。
前言 验证码输入框是很多APP必不可少的组件,之前在重构注册登录页面的时候,重新设计了UI,所以不能再简单的用EditText来做了,所以这篇文章将分享一下如何实现一个常见的验证码输入框。...只能输入,不能删除,这可不行啊,用户肯定会骂娘的,我可不想被拿去去祭天什么的… 于是乎只能想办法在原有的基础上做一些修改,来规避这个问题,最后采用的方案是:采用一个TextView的数组来维护6个TextView...在实现的过程中,遇到的一个关键问题就是:当输入的内容超过6位以后我该如何处理?...一开始的方案是通过判断当前输入的位数然后再做相应的处理,网上的方案也是这么实现的,我后来一想,根本用不着这么麻烦,只需要一行属性就能解决这个问题: android:maxLength="6" 只需要在EditText...的属性里限制它的最大长度,就不用再去代码里做处理了,直接把EditTextView里的内容完全照搬到TextView上就可以了。
,会发现输入框里没有内容,同时按get得到为0.0 同时第一种情况中我的打印Log.i("FiveActivity", "onSaveInstanceState");始终也是没有打印 接着第二种情况:...get时就会发现: EditText中的文字Hello World依旧存在,而我的Value变量变为0.0了。...总结: 1: 对于第一种情况,Android系统觉得是用户自愿的行为,觉得那就没有保存的必要了。...所以当我们Home出去时就会打印出现,至于我们的变量为啥没有恢复,很明显那是因为没人保存它的值,这就得需要我们程序员自己手动保存。...同时, 除系统资源不足时,或者手机的屏幕方向变化时,改变语言时,都会导致Activity重现销毁,然后重现再创建。这时候如果我们不保存需要保存的数据,也会出现不对的情况。
并且Button中有一个点击事件,当点击时将EditText的内容以toast显示。 ?...上面的代码是不是很简单易懂,当然,默认的控件并不能满足我们的需求,例如我们会更改字体的颜色及大小,会设置宽度和高度,会设置margin,padding值,那么该如何实行呢,当然也很简单,因为它的逻辑和xml...我想我不需要说明上面的代码,你就应该看得出控件实行的效果。因为它的属性和我们在xml设置属性的名字对应的。...但是它的性能是有优势的,其实吧并没有发觉性能优势。...不管怎样,这种DSL确实便于阅读,也很容易上手,在上面的代码中,你可能注意到了dip(10),它表示将10dp转换为像素的意思,是Anko的扩展函数,说的扩展函数,如果阅读过Anko的源码我们发现里面大量的使用扩展函数
前言 在Android开发中经常会遇到EditText控件,而在App开发过程中、遇到了这样一个问题、那就是Android EditText控件如何禁止往里面输入内容?...最开始找到修改版解决方法、但是当想输入的时候就有问题了、可以参考一下、但不建议这样写 EditText editText = (EditText) findViewById(R.id.editText1...editText.setFocusable(false) 项目需求是这样的、在EditText后面跟一个CheckBox、勾选CheckBox可以输入、否则不可以输入、另外也有这种需求、比如已经被setText...()内容、则需要禁止输入、防止它被修改、 如果没有显示内容、则将EditText设置为可输入状态 经过测试验证:setFocusable方法的效果只有第一次使用时有效、也就是说若在布局文件里面设置:...android:focusable="false" 即使你在代码中设置此控件属性:editText.setFocusable(true);也不能对它进行编辑、即setFocusable方案不可行、经过摸索得出可行方案利用
标签是作为标签的一种辅助扩展来使用的,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。...在上面我们讲解标签的用法时主要介绍了它优点,但是它也存在着一个不好的地方,就是可能会导致产生多余的布局嵌套。...那么我们如何才能让这些不常用的元素仅在需要时才去加载呢?Android为此提供了一种非常轻量级的控件,ViewStub。...ViewStub虽说也是View的一种,但是它没有大小,没有绘制功能,也不参与布局,资源消耗非常低,将它放置在布局当中基本可以认为是完全不会影响性能的。...下面我们就来学习一下如何使用ViewStub来完成仅在需要时才去加载布局的功能,目前profile.xml中只有一个EditText用于编辑信息,那么比如说我们还有另外三个不太常用的EditText,就可以将它们定义在另外一个布局文件当中
我们有时候的需求时,EditText 在不需要的时候,无法点击,或者取消它的默认焦点。 我们先看看通用解决方法。...="false" 按照上面的解决方案,我现在有5个 EditText,很多人会写出下面的例子: EditText e1; ......,由一个switch控制,当switch关闭时,editText可以输入,有焦点,否则无法点击,无焦点。...true, refocus); } 这里的意思是,如果焦点可用,或者非触控模式下,焦点会尝试将焦点放在第一个可以对焦的视图上,也就是说,相当于它被重置了,所以产生了我们上面图片里的问题,焦点没有被清除...总结一下,也就是我们需要在父布局处添加 触控模式为true,即就是android:focusableInTouchMode="true",这样当清除焦点的时候,就会将焦点赋给父布局,而不是重置到第一个EditText
EditText的应用场景非常普遍,在进行发短信、发微博、聊QQ等操作时,你不得不使用EditText。...这时由于EditText的高度指定的是wrap_content ,因此它总能包含住里面的内容,但是当输入的内容过多时,界面就会变得非常难看。...的最大行数为两行,这样当输入的内容超过两行时,文本就会向上滚动,而EditText则不会再继续拉伸。 ...如何才能让进度条在数据加载完成时消失呢?这里我们就需要用到一个新的知识点:**Android控件的可见属性。...当然,当本书后面涉及一些我们前面没学过的控件和相关用法时,我仍然会在相应的章节做详细的讲解。
我去,这下尴尬了。如果实现不了,岂不是显得自己很Low B!不行,无论如何都得做出来!(才能咽得下这口气!) 二、寻寻觅觅,不得所需 哼,系统没有的控件,我找个第三方的轮子还不行吗?...三、拆轮子 既然决定自己造轮子,必然要先分析一下这个轮子,把这个轮子拆开,看看它包含些什么东西。...如何显示文字?...光标结束位置的x坐标和起始位置相同,y坐标则为其实坐标加上文字高度 3)考虑多类型输入时的光标位置 当输入的文字包含汉字、英文、数字时,由于英文/数字的占位比汉字小,此时,如果按照汉字的单字来计算光标所在文字的索引...我采用的方法如下: 我们知道,这段长度,可以放置的最少文字个数,就是汉字的个数。 第一步,我们先取最少的汉字个数,并计算文字长度,如果这时,文字的长度没有超过实际触摸位置。
它允许用户输入文本和执行其他操作。但是,有时候我们需要在用户输入文本时进行一些特殊的处理,比如实时验证输入内容、限制输入字符的类型等。因此,了解如何监听软键盘输入是非常重要的。...如何监听软键盘输入 在Android中,我们可以使用EditText的TextWatcher接口来监听软键盘输入。...它允许应用程序与用户输入进行交互,并处理输入文本的各种操作,如插入、删除和替换文本。 InputConnection 是 Android 软键盘系统和 EditText 控件之间的桥梁。...deleteSurroundingText(int beforeLength, int afterLength):在用户删除文本时被调用,可以在此方法中处理删除操作。...setComposingText(CharSequence text, int newCursorPosition):在用户正在输入文本时被调用,可以在此方法中处理正在输入的文本。
领取专属 10元无门槛券
手把手带您无忧上云