0

我已经手动/以编程方式在我的工具栏中为片段页面设置了一个向上按钮,片段中包含以下代码onCreateOptionsMenu

(activity as AppCompatActivity).setSupportActionBar?.setDisplayHomeAsUpEnabled(true)

点击系统后退按钮将使用户回到上一个片段,但没有向上按钮(有效)我​​认为有些用户可能会迷路。

我很难弄清楚如何捕捉和处理向上按钮以将片段从后堆栈中弹出。

这篇SO 帖子显示了如何捕捉向上按钮单击,但它是在 Java 中,并且没有继续解释您将如何向上导航。

我认为它需要看起来像下面的代码,但到处都有错误:

  • 该案例android.R.id.home显示“不兼容的类型:Int 和 MenuItem”错误?

  • onBackPressed()显示“未解决的参考”错误。

错误代码:

override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when (item) {
            android.R.id.home -> {
                onBackPressed()
                return true
            }
            else -> return super.onOptionsItemSelected(item)
        }
}

更新:

对另一个SO 帖子的评论在 Kotlin 中有一个潜在的解决方案。它捕获了对向上按钮的单击并返回到上一个片段页面,但是向上按钮并没有消失。因此,即使在我的应用程序中的顶级片段目标(与 中的每个选项卡对应的页面BottomNavigationView)上,向上按钮现在仍然存在。

我认为这可能与我的应用程序中只有一个活动以及如上所述我在片段中设置向上按钮的方式有关?如果是这样,是否有解决方法或其他方法通过引用片段而不是整个活动来设置向上按钮?


如果有帮助,这是适配器.kt 文件中 RecyclerView 内部 ViewHolder 类中的代码,它导航到有问题的片段页面:

class AdapterListItemDetails(val items: List<ItemsList>) : RecyclerView.Adapter<AdapterListItemDeatils.ItemsViewHolder>() {

    //overrides for OnCreateViewHolder, getItemCount, onBindViewHolder

    inner class ItemsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        var currentItem: ItemsList? = null
        var currentPosition: Int = 0

        init {
             itemView.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.goto_details, null))
        }

        fun setData(itemsList: ItemsList, position: Int) {
            itemView.tview_Keys.text = itemsList!!.nameText

            this.currentItem = itemsList
            this.currentPosition = position
        }
    }
}
4

2 回答 2

0

嗨,这是我通常做的:在活动中从您的 navHostFragment 中找到 navController

val navController = this.findNavController(R.id.myNavHostFragment)

确保它已连接到 ActionBar

NavigationUI.setupActionBarWithNavController(this, navController)

然后简单地覆盖 onSupportNavigateUp,找到你的 navController 然后向上导航

override fun onSupportNavigateUp(): Boolean{
    val navController = this.findNavController(R.id.myNavHostFragment)
    return navController.navigateUp()
}
于 2019-05-26T19:12:33.703 回答
0

您必须在活动中覆盖 onBackPressed() 方法并使用手动代码处理片段事务。如果您可以分享一些活动片段和片段交易将帮助我提供一些适当的解决方案。

于 2018-06-30T13:55:22.880 回答