如何处理工具栏中的向上按钮-Kotlin

时间:2018-06-30 13:46:14

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

我已经在我的工具栏中手动/以编程方式为片段页面设置了向上按钮,并在片段的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)
        }
}

更新:

在Kotlin中对另一个SO post发表评论可能有解决方案。它捕获了向上按钮的单击,然后返回到上一个片段页面,但是向上按钮没有消失。因此,即使在我应用程序的顶级片段目的地(与BottomNavigationView中的每个标签相对应的页面)上,向上按钮也仍然存在。

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


如果有帮助,这是adapter.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
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您必须在活动中重写onBackPressed()方法,并使用手动代码处理片段事务。如果您可以分享一些活动摘要,那么零碎的交易将帮助我提供一些适当的解决方案。

答案 1 :(得分: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()
}