开发笔记主要是记录开发中遇到的一些问题和解决方案,以及引发的一些思考,不会太深入地记录问题,但是会尽可能广泛地记录涉及到的内容,方便之后整理归纳和查阅
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 override fun filter (source: CharSequence ?, start: Int , end: Int , dest: Spanned ?, dstart: Int , dend: Int ) : CharSequence { 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) { return "" } } } } 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 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