handleOnBackPressed 不适用于一个片段
handleOnBackPressed not working on one fragment
我在我的程序中使用带有抽屉和应用栏的导航组件。
从主页片段,它有一个回收视图,当每个项目被点击时,nav_host_fragment 使用以下行托管另一个具有所选 itme 的片段:
Navigation.findNavController(view).navigate(R.id.doTimedTaskFragment, args);
问题是,如果用户点击应用栏中的后退按钮,我需要询问他们是否要放弃他们在新片段 (doTimedTaskFragment) 中取得的进展。
我挖掘了 Google 文档,下面 link 给出了我应该如何做。
https://developer.android.com/guide/navigation/navigation-custom-back#java
public class MyFragment extends Fragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// This callback will only be called when MyFragment is at least Started.
OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
@Override
public void handleOnBackPressed() {
// Handle the back button event
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
// The callback can be enabled or disabled here or in handleOnBackPressed()
}
...
}
但是,handleOnBackPressed()
从未被调用,我怀疑我上面使用的代码行指向新片段,但我找不到解决此问题的方法。
EDIT/UPDATE:
我的问题最初是询问如何处理点击导航组件的左(后)箭头点击行为,在我的例子中,我在片段内覆盖 onOptionsItemSelected
并且代码比在 [=14 内覆盖更清晰和更好=].
这里是screenshot of my mobile navigation.xml
OnBackPressedCallback
在设备上调用后退按钮而不是 Toolbar
后退按钮。对于工具栏后退按钮,您必须使用导航控制器进行设置。
在你的activity的onCreate
中:
setSupportActionBar(findViewById(R.id.toolbar))
val nc = findNavController(this, R.id.nav_host_fragment)
val appBarConfiguration = AppBarConfiguration.Builder(nc.graph).build()
setupActionBarWithNavController(
this,
nc,
appBarConfiguration
)
然后:
override fun onSupportNavigateUp(): Boolean {
//Handle the toolbar back button here.
val navController = findNavController(this, R.id.nav_host_fragment)
navController.currentDestination?.let {
if (it.id == R.id.someFragment) {
//do something here
} else {
navController.popBackStack()
}
}
return super.onSupportNavigateUp()
}
我在我的程序中使用带有抽屉和应用栏的导航组件。
从主页片段,它有一个回收视图,当每个项目被点击时,nav_host_fragment 使用以下行托管另一个具有所选 itme 的片段:
Navigation.findNavController(view).navigate(R.id.doTimedTaskFragment, args);
问题是,如果用户点击应用栏中的后退按钮,我需要询问他们是否要放弃他们在新片段 (doTimedTaskFragment) 中取得的进展。
我挖掘了 Google 文档,下面 link 给出了我应该如何做。 https://developer.android.com/guide/navigation/navigation-custom-back#java
public class MyFragment extends Fragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// This callback will only be called when MyFragment is at least Started.
OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
@Override
public void handleOnBackPressed() {
// Handle the back button event
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
// The callback can be enabled or disabled here or in handleOnBackPressed()
}
...
}
但是,handleOnBackPressed()
从未被调用,我怀疑我上面使用的代码行指向新片段,但我找不到解决此问题的方法。
EDIT/UPDATE:
我的问题最初是询问如何处理点击导航组件的左(后)箭头点击行为,在我的例子中,我在片段内覆盖 onOptionsItemSelected
并且代码比在 [=14 内覆盖更清晰和更好=].
这里是screenshot of my mobile navigation.xml
OnBackPressedCallback
在设备上调用后退按钮而不是 Toolbar
后退按钮。对于工具栏后退按钮,您必须使用导航控制器进行设置。
在你的activity的onCreate
中:
setSupportActionBar(findViewById(R.id.toolbar))
val nc = findNavController(this, R.id.nav_host_fragment)
val appBarConfiguration = AppBarConfiguration.Builder(nc.graph).build()
setupActionBarWithNavController(
this,
nc,
appBarConfiguration
)
然后:
override fun onSupportNavigateUp(): Boolean {
//Handle the toolbar back button here.
val navController = findNavController(this, R.id.nav_host_fragment)
navController.currentDestination?.let {
if (it.id == R.id.someFragment) {
//do something here
} else {
navController.popBackStack()
}
}
return super.onSupportNavigateUp()
}