【问题标题】:kotlin android "OnbackPressed" overrides nothingkotlin android“OnbackPressed”什么都不覆盖
【发布时间】:2020-05-13 18:15:41
【问题描述】:

我知道这已经问过几次了,但我还是什么都没得到(我是 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”覆盖 Nothing

我错过了什么吗?我已经在寻找解决方案,但仍然对此感到困惑。

【问题讨论】:

  • onBackPressed()Activity 中的函数,而不是Fragment 中的函数。因此,您不能在 DashboardFragment 中覆盖它。
  • 知道我必须如何覆盖它们吗?
  • 我强烈建议不要禁用 BACK 按钮。但是,如果这样做,则需要在活动中覆盖 onBackPressed() 并在那里做出决定。
  • @CommonsWare - 不再是这种情况了,您需要关注Provide custom back navigation documentation,它允许任何组件(包括片段)拦截和处理后退按钮。
  • @CommonsWare - 从技术上讲,它是 AndroidX Activity 的一部分,它甚至位于 Fragments 之下。只是碰巧更高级别的库(例如 Fragments 和 Navigation)也挂钩。

标签: android android-fragments kotlin


【解决方案1】:

谁知道... onSupportNavigateUp() 仅适用于 4.0 及更高版本。对于下面的 onNavigateUp() 被调用。

所以

    override fun onNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.myNavHostFragment)

        return navController.navigateUp()
    }

【讨论】:

    【解决方案2】:

    你可以做的是在插入它们时将你的非后退按钮片段设置为 backstack,这是由

    完成的
    val transaction = supportFragmentManager.beginTransaction()
    transaction.addToBackStack(null)
    transaction.replace(R.id.frame, fragment) //or add, whatever you use
    transaction.commit()
    

    (如果您想要返回按钮功能,只需跳过 addtoBackStack 行)

    然后,同样在您的活动中,您覆盖 onBackPressed() 并检查后台堆栈是空的还是满的。如果为空,则检查

    if(supportFragmentManager.backStackEntryCount() == 0)
    

    然后,例如,您在支持后退按钮的片段上,只需执行 super.onBackPressed()。

    另一方面,如果它有东西,你可以做 navController.navigateUp() 部分,完成后,使用 supportFragmentManager.popBackStackImmediate() 弹出它。

    我认为您可以制作类似的东西,尝试一下,然后告诉我们:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多