我知道这个问题已经问过几次了,但是我毕竟还是一无所获(我在android开发中是很新的。)
所以我像这样在MainActivity.kt中设置后退按钮:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val navController = this.findNavController(R.id.myNavHostFragment)
NavigationUI.setupActionBarWithNavController(this, navController)
supportActionBar?.setDisplayHomeAsUpEnabled(false)
}
// Set up the back button on action bar
override fun onSupportNavigateUp(): Boolean {
val navController = this.findNavController(R.id.myNavHostFragment)
return navController.navigateUp()
}
}
我想在某些片段中禁用此后退按钮,因此我尝试在其中一个片段中覆盖onBackPressed()
函数(这是互联网上大多数人所说的):
class DashboardFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Declare that this fragment has menu
setHasOptionsMenu(true)
// Set action bar title to "Main Dashboard"
(activity as AppCompatActivity).supportActionBar?.title = "Main Dashboard"
// Binding object for this fragment and the layout
val binding: FragmentDashboardBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_dashboard, container, false)
//Some codes here//
return binding.root
}
// This is where the error occured
override fun onBackPressed() {
super.onBackPressed()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater?.inflate(R.menu.nav_overflow_menu, menu)
}
}
但是它返回一条错误消息:
“ OnBackPressed”不覆盖任何内容
我错过了什么吗?我已经在寻找解决方案,但对此仍然感到困惑。
答案 0 :(得分:0)
谁知道... onSupportNavigateUp() 仅适用于 4.0 及更高版本。对于下面的 onNavigateUp() 被调用。
所以
override fun onNavigateUp(): Boolean {
val navController = this.findNavController(R.id.myNavHostFragment)
return navController.navigateUp()
}
答案 1 :(得分:0)
您可以做的是在插入时将非后退按钮片段设置为 backstack,这是由
val transaction = supportFragmentManager.beginTransaction()
transaction.addToBackStack(null)
transaction.replace(R.id.frame, fragment) //or add, whatever you use
transaction.commit()
(如果您想要后退按钮功能,只需跳过 addtoBackStack 行)
然后,同样在您的活动中,您覆盖 onBackPressed() 并检查 backstack 是空的还是满的。如果为空,则由
检查if(supportFragmentManager.backStackEntryCount() == 0)
例如,您在一个支持后退按钮的片段上,只需执行 super.onBackPressed()。
另一方面,如果它有东西,你可以做 navController.navigateUp()
部分,完成后,使用 supportFragmentManager.popBackStackImmediate() 弹出它。
我认为你可以做这样的事情,尝试一下,然后告诉我们:)