You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Leanback Search片段搜索结果获焦后按返回键异常关闭,求规避方案

规避Leanback Search Fragment返回键意外关闭的方案

我之前也碰到过这个Leanback框架的问题,确实有点棘手。针对你描述的「提交搜索后按返回键,松开时Fragment意外关闭」的情况,这里有几个经过验证的临时规避方案:

方案1:重写SearchFragment的onBackPressed方法

直接拦截返回键事件,根据当前状态决定是否消费事件,阻止默认的Fragment关闭逻辑:

override fun onBackPressed(): Boolean {
    val searchEditText = view?.findViewById<SearchEditText>(R.id.lb_search_text_editor)
    // 判断条件:搜索框已失去焦点(说明搜索结果已显示)且有输入内容
    if (searchEditText?.isFocused == false && searchEditText.hasText()) {
        // 让搜索框重新获取焦点,替代关闭Fragment的行为
        searchEditText.requestFocus()
        return true // 消费事件,不传递给上层处理
    }
    // 其他情况(比如无搜索结果、搜索框仍聚焦)按默认逻辑处理
    return super.onBackPressed()
}

方案2:监控返回键的按下/抬起事件

因为问题出在松开返回键时触发关闭,我们可以分别处理onKeyDown和onKeyUp事件,避免默认逻辑执行:

private var isBackKeyPressed = false

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        isBackKeyPressed = true
        val searchEditText = view?.findViewById<SearchEditText>(R.id.lb_search_text_editor)
        if (searchEditText?.isFocused == false) {
            // 按下返回键时先处理焦点转移和键盘隐藏
            searchEditText.requestFocus()
            return true
        }
    }
    return super.onKeyDown(keyCode, event)
}

override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean {
    if (keyCode == KeyEvent.KEYCODE_BACK && isBackKeyPressed) {
        isBackKeyPressed = false
        // 松开时消费事件,不触发默认的Fragment关闭
        return true
    }
    return super.onKeyUp(keyCode, event)
}

方案3:在Activity层监听BackStack变化

通过Activity的Fragment管理器,在SearchFragment显示搜索结果时动态添加返回键监听:

// 在宿主Activity中实现
getSupportFragmentManager().addOnBackStackChangedListener(() -> {
    Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
    if (currentFragment instanceof SearchFragment) {
        SearchFragment searchFragment = (SearchFragment) currentFragment;
        // 假设你有判断是否显示搜索结果的方法,比如hasSearchResults()
        if (searchFragment.hasSearchResults()) {
            currentFragment.getView().setOnKeyListener((v, keyCode, event) -> {
                if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                    SearchEditText editText = currentFragment.getView().findViewById(R.id.lb_search_text_editor);
                    editText.requestFocus();
                    return true;
                }
                return false;
            });
        }
    }
});

注意事项

  • 这些都是临时的规避方案,等官方修复该框架Bug后记得移除自定义逻辑,避免冲突。
  • 测试时要覆盖所有场景:比如无搜索结果时返回键的行为、搜索框仍聚焦时的返回行为,确保不影响正常功能。

内容的提问来源于stack exchange,提问作者Preslav Petkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:26