我正在制作一个简单的笔记应用程序,我有2个带有导航组件的片段,一个片段包含一个笔记列表,另一个片段用于编辑或创建新笔记。
在Sub FillData()
Dim ws As Worksheet
Set ws = ActiveWorkbook.Sheets.Add(After:=ActiveSheet)
With ws
Range("A1").Value2 = "joro1. Inc"
Range("A2").Value2 = "joro1"
Range("B1").Value2 = "100"
Range("B2").Value2 = "1"
Range("C1").Value2 = "100"
Range("C2").Value2 = "2"
Range("D1").Value2 = "10"
Range("D2").Value2 = "2"
End With
End Sub
中,我添加了
MainActivity
,然后覆盖val navController = this.findNavController(R.id.host_fragment)
NavigationUI.setupActionBarWithNavController(this, navController)
onSupportNavigateUp()
在override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.host_fragment)
return navController.navigateUp()
}
NoteEditFragment
现在在按设备上的“后退按钮”时一切正常,但是,当我按屏幕左上方的“上按钮”时,会触发requireActivity().onBackPressedDispatcher.addCallback(this) {
saveOrUpdateNote(noteId, note)
}
。
我的问题是:如何处理onBackPressedDispatcher.addCallback()
中的向上按钮?
预先感谢
答案 0 :(得分:1)
我认为接受的答案有点混乱。所以,我找到了一个干净的代码。它非常适合我的用例,因为按下设备后退按钮时我不需要做任何特殊的事情。因此,这里有相同要求的任何人都可以遵循我的代码。
在 MainActivity 的 onCreate 中:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(navController.graph)
// Check if androidx.navigation.ui.NavigationUI.setupActionBarWithNavController is imported
// By default title in actionbar is used from the fragment label in navigation graph
// To use the app name, remove label else if you want to add customized label specify it there
setupActionBarWithNavController(this, navController, appBarConfiguration)
...
}
同样,在 MainActivity 本身中:
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.fragment)
// Check if androidx.Navigation.ui navigateUp is imported and used
return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
}
为了更好的理解,我添加了注释。如果您认为答案有帮助,请点赞。谢谢。快乐发展:)
编辑 1:
无需在片段中使用 supportActionBar.setDisplayHomeAsUpEnabled(true)
。 AppBarConfiguration 会处理它。
答案 1 :(得分:0)
最后,我找到了解决方案。
首先,在activity
onCreate
方法中,我必须像以前那样连接导航:
val navController = this.findNavController(R.id.host_fragment)
NavigationUI.setupActionBarWithNavController(this, navController)
然后仍在MainActivity
中覆盖onSupportNavigateUp()
:
override fun onSupportNavigateUp(): Boolean
{
val navController = this.findNavController(R.id.host_fragment)
return navController.navigateUp()
}
然后在Fragment
onCreateView
中,我必须启用选项菜单:
setHasOptionsMenu(true)
然后在fragment
中我改写了onOptionsItemSelected
:
override fun onOptionsItemSelected(item: MenuItem): Boolean
{
// handle the up button here
return NavigationUI.onNavDestinationSelected(item!!,
view!!.findNavController())
|| super.onOptionsItemSelected(item)
}
注意:我想如果您有多个选项菜单,那么我认为您必须执行when (item)
语句来检查已选择了哪个选项。
如果您想操作设备后退按钮,也可以在fragment
onCreateViewMethod
中这样做:
requireActivity().onBackPressedDispatcher.addCallback(this)
{
// handle back button
// change this line to whatever way you chose to navigate back
findNavController().navigate(NoteEditFragmentDirections.actionNoteEditFragmentToNoteListFragment())
}
答案 2 :(得分:0)
如果你使用 noActionBar 主题并且你想使用你自己的工具栏作为片段的 actionBar,你可以使用这个方法
在主机活动中
override fun onSupportNavigateUp(): Boolean {
return findNavController(R.id.navHostFragment).navigateUp()
}
在片段的 onCreateView 中
(activity as AppCompatActivity).setSupportActionBar(binding.toolbar)
(activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
答案 3 :(得分:0)
以非常简单的方式,您只需要在 Activity 上设置 supportNavigateUp。
在MainActivity中:
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController = navHostFragment.navController
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp() || super.onSupportNavigateUp()
}
在我的情况下它有效