我已经在几个地方看到了这一点,但由于没有在线示例,因此无法弄清楚如何实现它,我想知道我是否误解了它的含义。
addOnBackPressedCallback 的 android 开发者链接
我想知道这是否意味着我可以在我的片段中添加一个回调来onBackPressed()在它到达活动之前接收它。
在我的片段中,我实现了
implements OnBackPressedCallBack
Run Code Online (Sandbox Code Playgroud)
然后实现了方法
@Override
public boolean handleOnBackPressed() {
Log.d(TAG, "handleOnBackPressed: hello");
return true;
}
Run Code Online (Sandbox Code Playgroud)
但它没有拿起它并直接进入主要活动onBackPressed()。
我进一步阅读并看到我的片段需要从 FragmentActivity 扩展
public class MainExampleFragment extends FragmentActivity implements View.OnClickListener, OnBackPressedCallback {
Run Code Online (Sandbox Code Playgroud)
而不是
appCompatActivity.getSuppportFragmentManager
Run Code Online (Sandbox Code Playgroud)
打电话
FragmentActivity.getSupportFragmentManager
Run Code Online (Sandbox Code Playgroud)
相反,但是当尝试设置包时,这会在 Fragment.newInstance 方法中抛出并出错。
有没有人做这方面的信息,谢谢
aar*_*ino 10
正如@Derek Zhu 指出的那样,似乎如果您在活动中覆盖 onBackPressed,那么 Fragment 的 onBackPressedCallback 将不起作用。我发现如果我也想在活动中使用它,那么我也需要在onBackPressedDispatcher.addCallback那里使用。
活动:
onBackPressedDispatcher.addCallback(
this,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
Log.d(TAG, "Activity 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)
分段:
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)
上面的结果是会调用Fragment backpressed,然后Activity backpressed。
AppCompatActivity 扩展 FragmentActivity 扩展 ComponentActivity(androidx.fragment.app.ComponentActivity) 扩展 (androidx.core.app.ComponentActivity)
所以 addOnBackPressedCallback 也应该适用于 AppCompatActivity