fragment监听返回键

setOnKeyListener

  通过给fragment的根view添加按键按下监听,此方法接收的按键监听用法类似于Activity中的onKeyDown(int, KeyEvent)

1
2
3
4
5
6
7
8
9
10
11
12
// 设置view在触摸模式下可获得焦点,从而能够接收按键事件
view.setFocusableInTouchMode(true);
// 请求将焦点移动到view
view.requestFocus();
// 设置按键事件监听
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// ...
return false;
}
});

  例如监听返回键按下

1
2
3
4
5
6
7
8
9
10
11
view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
Log.d(TAG, "handleOnBackPressed: 按下返回键");
}
return true;
}
});

  这其中:
  setFocusableInTouchMode(boolean)是用于设置view在触摸模式下是否可获取焦点,从而能够接收按键事件
  requestFocus()用于请求将焦点设置到指定的view,当调用这个方法时,系统会尝试将焦点移到指定的view上,使得该view能够响应用户的输入事件,比如按键事件。通常requestFocus()会与setFocusableInTouchMode(true)一起使用,以确保在触摸模式下能够接收焦点
  setOnKeyListener是用于设置按键事件监听器的方法

OnBackPressedCallback

  该方法用于处理用户按下返回按钮的情况,类似于Activity中的onBackPressed()

1
2
3
4
5
6
7
8
OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
Log.d(TAG, "handleOnBackPressed: 按下返回键");
}
};

getActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), onBackPressedCallback);

  这其中:
  OnBackPressedCallbackAndroidX Lifecycle库中的类,创建一个回调对象,用于处理返回按钮按下的事件,true代表启用该回调,默认为启用;当用户按下返回按钮时执行handleOnBackPressed中的逻辑
  getOnBackPressedDispatcher()用于获取一个OnBackPressedDispatcher对象,通过该对象注册回调以处理返回按钮的事件
  addCallback()用于添加处理返回按钮按下的事件,接收一个getViewLifecycleOwner()参数和onBackPressedCallback回调