Jas*_*oms 6 android android-jetpack android-architecture-navigation androidx
我最近更新了我的依赖项,以包含OnBackPressedCallback从接口到抽象类的更改。
我已经根据此处的新文档进行了设置,但我觉得事情并没有像他们应该的那样工作。
我的片段OnCreate看起来很像文档:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requireActivity().onBackPressedDispatcher.addCallback(this) {
backPressed()
}
}
Run Code Online (Sandbox Code Playgroud)
当我按下后退按钮时,代码backPressed()运行,但没有更多的发生。
我曾尝试在回调内部调用handleBackPressed()andrequireActivity().onBackPressedDispatcher.onBackPressed()和requireActivity().onBackPressed(),但这些都会导致 StackOverflowError ,因为它似乎递归地运行该回调。
必须有一些非常明显的东西我错过了......
ian*_*ake 11
当您注册 时OnBackPressedCallback,您就承担了处理后退按钮的责任。这意味着当您收到回调时,不会发生其他后按行为。
如果您使用Navigation,则可以使用NavController弹出后退堆栈:
requireActivity().onBackPressedDispatcher.addCallback(this) {
backPressed()
// Now actually go back
findNavController().popBackStack()
}
Run Code Online (Sandbox Code Playgroud)
这对我有用androidx.appcompat:appcompat:1.1.0
requireActivity().onBackPressedDispatcher.addCallback(
this,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
Log.d(TAG, "Fragment back pressed invoked")
// Do custom work here
// if you want onBackPressed() to be called as normal afterwards
if (isEnabled) {
isEnabled = false
requireActivity().onBackPressed()
}
}
}
)
Run Code Online (Sandbox Code Playgroud)
必须有一些非常明显的东西我错过了......
在要求 Activity 处理回压之前,您忘记禁用片段中的自定义回调。
我的解决方案适合我:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final OnBackPressedCallback callback = new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
if (/*situation to handle back pressing*/){
//here handle your backPress in your fragment
} else {
setEnabled(false); //this is important line
requireActivity().onBackPressed();
}
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6935 次 |
| 最近记录: |