开发笔记-TextView & EditText

开发笔记主要是记录开发中遇到的一些问题和解决方案,以及引发的一些思考,不会太深入地记录问题,但是会尽可能广泛地记录涉及到的内容,方便之后整理归纳和查阅

No.1 TextView 添加 SpannableString 点击事件,并添加点击色

1
2
tv.movementMethod = LinkMovementMethod.getInstance() // 必须设置否则无法点击
tv.highlightColor = SkinManager.resourcesTool.getColor(android.R.color.transparent) // 设置点击后的高亮颜色,这里设置为透明,即点击后无反应

No.2 TextView 添加下划线并抗锯齿

1
textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);

No.3 TextView 中 Emoji 变淡

TextView 中有 Emoji 时,Emoji 会变淡发白,具体的表现如该文章中后半部分图片所示,评论中也有人提及

具体的解决办法:设置 textColor 后即可,可能与文字颜色相关,具体原理未知

No.4 EditText maxLines 不生效的问题

这是由于 android:inputType 属性默认值为 none 的缘故,设置 maxLines 后,再设置一下 inputType,就可以正常生效了

如果要设置单行的话,设置 singleLine 为 true 可以生效,但是 singleLine 已经过期了,提示用使用 android:maxLines="1" 代替,设置之后也要记得设置一下 inputType,否则会没有效果。同理 TextView 应该也是一样

No.5 EditText showSoftInput 不起作用

有的时候需要在界面一显示时就让输入框处于焦点状态,并且需要键盘弹出,方便用户输入,需要以下代码

1
2
android:focusable="true"
android:focusableInTouchMode="true"
1
2
3
editText.requestFocus()
val inputManager = editText.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputManager.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT)

有时当该 EditText 还未被绘制出来,InputMethodManager 还不能获取到该控件的焦点,软键盘不会弹出,manager.showSoftInput() 函数返回 false,告诉你键盘并未显示,而当 EditText 完全被绘制出来了,就可以去获取焦点了,所以需要添加绘制完毕监听,当 EditText 被绘制完毕时,调用 onGlobalLayoutListener.onGlobalLayout,正确展示键盘

1
2
3
editText?.viewTreeObserver?.addOnGlobalLayoutListener {
showKeyboard(editText)
}

相关链接

No.6 EditText 输入中文时出现下划线拼音处理

在开发过程中,有时候会需要监听 EditText 输入内容长度做出反应的操作,但是像某些手机如小米的输入机制,会在输入中文的时候出现带下划线的拼音,这种情况影响了 EditText 输入长度监听

处理方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 首先新建一个 自定义 InputFilter 继承 InputFilter
// 重写 filter() 方法,在filter 中过滤带下划线的字符

/**
* @param start 新输入的字符串起始下标,一般为0
* @param end 一次性输入的长度,删除为 0
* @param dest 原内容起始坐标
* @param dstart 原内容终点坐标
*/
override fun filter(source: CharSequence?, start: Int, end: Int, dest: Spanned?, dstart: Int, dend: Int): CharSequence {
// 下划线字符不输入,避免输入中文的时候出现带下划线的拼音,这种情况影响了 EditText 输入长度监听
val spannableString = SpannableString(source)
val spans = spannableString.getSpans(0, spannableString.length, Any::class.java)
if (spans != null) {
for (span in spans) {
if (span is UnderlineSpan) { // 带下划线的 span
return ""
}
}
}
}

// 最后把 filters 设置到 editText 中 see MaxLengthInputFilter
dialog_edit.filters = arrayOf(MaxLengthInputFilter(5))

InputFilter 是系统提供的一个接口类,里面只有一个方法 filter(),用于过滤输入/插入的字符串,返回值为 CharSequence

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public interface InputFilter {
CharSequence filter(CharSequence var1, int var2, int var3, Spanned var4, int var5, int var6);

public static class LengthFilter implements InputFilter {
public LengthFilter(int max) {
throw new RuntimeException("Stub!");
}

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
throw new RuntimeException("Stub!");
}

public int getMax() {
throw new RuntimeException("Stub!");
}
}

public static class AllCaps implements InputFilter {
public AllCaps() {
throw new RuntimeException("Stub!");
}

public AllCaps(@NonNull Locale locale) {
throw new RuntimeException("Stub!");
}

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
throw new RuntimeException("Stub!");
}
}
}

No.7 Edittext 设置 inputType 为密码不能生效

1
2
3
4
5
6
7
8
9
10
11
// 设置密文的时候,需要同时设置 TYPE_CLASS_TEXT 才能生效
et_price.setInputType(InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD)

// 设置小数
et_price.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL or InputType.TYPE_CLASS_NUMBER)

// 设置无符号小数
et_price.setInputType(InputType.TYPE_NULL or InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)

// 设置有符号小数
et_price.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED or InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL)

No.8 EditText 全角半角问题

密码默认全角,需要设置半角以免影响 hint 的字体,设置半角需要在设置 inputType 之后,且全角半角可能会影响行数,出现即使设置了 maxLines 也无效的情况,切换明文密文显示,会让 digits 设置无效,需要另外实现 InputFilter


开发笔记-TextView & EditText
https://enderhoshi.github.io/2024/03/05/开发笔记-TextView & EditText/
作者
HoshIlIlI
发布于
2024年3月5日
许可协议