【2021】Week Bug 汇总(第一期)
1.华为手机 Android9.0以上安全键盘挡住Toast问题
严重程度:★☆ 问题描述: EditText如果设置
inpuType="textPassword"
并且焦点在该EditText上,弹出的是华为安全键盘这时会挡住Toast提示。
解决方案:
方案1. 点击按钮时让其他View获取焦点;
方案2. 点击按钮时,隐藏安全键盘;
/**
* 显示软键盘
*/
fun showKeyboard(view: View) {
val imm: InputMethodManager = view.context
.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
if (imm != null) {
view.requestFocus()
imm.showSoftInput(view, 0)
}
}
/**
* 隐藏软键盘
*/
fun hideKeyboard(view: View) {
val imm = view.context
.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm?.hideSoftInputFromWindow(view.windowToken, 0)
}
方案3. 本质还是隐藏键盘
//解决华为安全键盘遮挡Toast问题
fun doHuaWeToastCovered(activity: Activity) {
if (Build.MANUFACTURER == "huawei") {
val findFocus = activity.window.decorView.findFocus()
if (findFocus is EditText) {
var editText = findFocus
if ((editText.inputType == (InputType.TYPE_TEXT_VARIATION_PASSWORD or InputType.TYPE_CLASS_TEXT))
or (editText.inputType == (InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD))) {
val systemService: InputMethodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
systemService.hideSoftInputFromWindow(editText.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}
}
}
}
Tips:通过view.post
执行该方法。
2.EditText 密码模式监听 setOnKeyListener 小米安全键盘 KeyEvent.KEYCODE_DEL 无返回值问题
严重程度:★★★☆ 问题描述: 自定义控件中,EditText 密码模式监听 setOnKeyListener 小米安全键盘 KeyEvent.KEYCODE_DEL 无返回值问题,导致不能回调键盘事件,删除显示的文本。
et.setOnKeyListener { _, keyCode, event ->
if (keyCode == KeyEvent.KEYCODE_DEL && event.action == KeyEvent.ACTION_DOWN && codes.size > 0) {
codes.removeAt(codes.size - 1)
setTextViews()
block?.invoke((codes.size == 6))
true
} else {
false
}
}
解决方案: 既然是小米安全键盘的安全措施,只能根据需求调整。自定义控件其实是输入验证码的自定义控件,监听删除EditText内容,对多个TextView内容的显示进行控制。
方案1. 对EditText的InputType由 android:inputType="numberPassword"
调整为 android:inputType="number"
方案2:直接监听EditText内容变化,通过addTextChangedListener 来回显TextView内容。
3.NestedScrollView中嵌套RecyclerView发生切换后自动滑动到底部问题
严重程度:★★☆ 问题描述: 主Activity是由 Activity + 四个Fragment来组成的,首页Fragment用的是NestedScrollView嵌套其他View + RecyclerView,当由首页Fragment切换到其他Fragment,然后再切换回来之后,在华为手机上会出现首页Fragment自动滑动到底部的问题。
问题探究:
1.可能由于RecyclerView比较容易的抢占焦点,导致每次都滑动到RecyclerView的第一个条目。
2.可能是之前布局嵌套 CoordinatorLayout + NestedScrollView
对NestedScrollView设置的layout_behavior
导致滑动问题。
解决方案:
针对1:
既然是RecyclerView
抢占焦点,那么把焦点手动设置位于NestedScrollView
顶部的View
。
在NestedScrollView
下的第一个子布局添加这两个属性:
android:descendantFocusability="blocksDescendants"
android:focusable="true"
android:focusableInTouchMode="true"
针对2:
移除对NestedScrollView设置的layout_behavior
。