【2021】Week Bug 汇总(第一期)

662 阅读2分钟

【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