使用的是 androidx.appcompat:appcompat:1.6.1
里面的相关接口
在新版本上,原来的onBackPressed()
标记过时了,需要使用onBackPressedCallback
代替,
注意onBackPressedCallback
不管android:enableOnBackInvokedCallback
这个属性的值,都会调用的
文档里的描述 :
如需支持预测性返回手势,您需要使用向后兼容的 OnBackPressedCallback
AppCompat 1.6.0-alpha05 (AndroidX) 或更高版本的 API,或使用新的 OnBackInvokedCallback
平台 API。大多数应用将使用向后兼容的 AndroidX API。
此更新提供了一种迁移路径,用于正确拦截返回导航,包括将 KeyEvent.KEYCODE_BACK
和任何具有 onBackPressed
方法的类(例如 Activity
和 Dialog
)所涉及的返回拦截替换成新的系统 Back API。
我理解就是用OnBackPressedCallback
就行,除非你的app不是AndroidX,就得用OnBackInvokedCallback
下面是简单的使用演示
private OnBackPressedCallback onBackPressedCallback = null;
public interface OnMyBackPressedSupport{
void onBackPresse();
}
private static class MyOnBackPressedCallback extends OnBackPressedCallback {
private OnMyBackPressedSupport onBackPressedSupport = null;
public MyOnBackPressedCallback(boolean enabled,OnMyBackPressedSupport onBackPressedSupport) {
super(enabled);
this.onBackPressedSupport = onBackPressedSupport;
}
@Override
public void handleOnBackPressed() {
if (onBackPressedSupport != null)
onBackPressedSupport.onBackPresse();
}
}
/**
* 启用新返回手势
*/
public boolean enableNewBackPressed = true;
/**
* 注意, 不能在回调里调用原来 系统函数 onBackPressed() ,会死循环
* @param onBackPressedSupport
*/
public void registerNewOnBackCallback(OnMyBackPressedSupport onBackPressedSupport){
if (!enableNewBackPressed) return;
if (onBackPressedCallback == null)
onBackPressedCallback = new MyOnBackPressedCallback(true, onBackPressedSupport);
onBackPressedCallback.remove();
this.getOnBackPressedDispatcher().addCallback(this,onBackPressedCallback);
}
public void unregisterNewOnBackCallback(){
if (!enableNewBackPressed) return;
if (onBackPressedCallback != null)
onBackPressedCallback.remove();
}
网友评论