kotlin android“ OnbackPressed”不会覆盖任何内容

时间:2020-05-13 18:15:41

标签: android android-fragments kotlin

我知道这个问题已经问过几次了,但是我毕竟还是一无所获(我在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”不覆盖任何内容

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

2 个答案:

答案 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() 弹出它。

我认为你可以做这样的事情,尝试一下,然后告诉我们:)