【问题标题】:How to handle up button in toolbar - Kotlin如何处理工具栏中的向上按钮 - Kotlin
【发布时间】:2018-06-30 13:46:13
【问题描述】:

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

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

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

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

这个SO post 展示了如何捕捉向上按钮的点击,但它是在 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 post 的评论在 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
        }
    }
}

【问题讨论】:

    标签: android-fragments kotlin navigation android-toolbar up-button


    【解决方案1】:

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

    【讨论】:

    • 我正在使用导航架构组件,据我所知,它应该完成处理所有片段事务的所有艰苦工作。如果有帮助,这是adapter.kt文件中RecyclerView内部ViewHolder类中的代码,该文件导航到相关的片段页面:init {itemView.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.goto_details, null))}
    【解决方案2】:

    嗨,这是我通常做的: 在活动中从您的 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()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多