Android TV Leanback下按遥控器返回键优先隐藏软键盘的实现问题
解决方案
核心思路是在Activity分发按键事件时优先拦截返回键,判断软键盘处于显示状态时优先隐藏软键盘,不传递事件给下层控件;软键盘隐藏后再按返回键才走默认返回逻辑。
操作步骤
- 在
SearchActivity中新增软键盘状态判断和隐藏工具方法 - 重写按键分发方法拦截返回键事件
完整修改后的代码
SearchActivity 代码
public class SearchActivity extends LeanbackActivity { private SearchFragment mFragment; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search); mFragment = (SearchFragment) getSupportFragmentManager() .findFragmentById(R.id.search_fragment); } @Override public boolean onSearchRequested() { mFragment.startRecognition(); return true; } // 新增:判断软键盘是否正在显示 private boolean isSoftInputShowing() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); // 输入法正在接收文本输入时即为显示状态 return imm.isAcceptingText(); } // 新增:隐藏软键盘 private void hideSoftInput() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); View focusView = getCurrentFocus(); if (focusView != null) { imm.hideSoftInputFromWindow(focusView.getWindowToken(), 0); } } // 重写按键分发逻辑,优先处理返回键 @Override public boolean dispatchKeyEvent(KeyEvent event) { // 拦截返回键按下事件 if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { if (isSoftInputShowing()) { hideSoftInput(); // 消费本次事件,不再向下传递给Fragment或列表控件 return true; } } // 其他情况走默认逻辑 return super.dispatchKeyEvent(event); } }
原理解释
Leanback的SearchSupportFragment在搜索结果有可展示条目时,焦点会自动落到结果列表控件上,此时返回键事件会优先被列表控件消费,直接触发页面回退逻辑,不会处理软键盘隐藏。我们在Activity层级优先拦截返回键事件,判断软键盘显示时优先隐藏,就可以统一实现不管有没有搜索结果,第一次按返回都先收键盘,第二次按返回再退出的效果。
内容的提问来源于stack exchange,提问作者sadat
相关产品推荐
相关产品推荐

