Как обработать кнопку вверх на панели инструментов - Kotlin

Я вручную / программно настроил кнопку вверх на панели инструментов для фрагмента страницы со следующим кодом в 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).

Я думаю, что это может быть связано с тем, что в моем приложении есть только одно действие, и с тем, как я установил кнопку вверх во фрагменте, как упомянуто выше? Если это так, есть ли обходной путь или другой способ настроить кнопку вверх, ссылаясь на фрагмент вместо всего действия?


Если это помогает, это код во внутреннем классе ViewHolder RecyclerView в файле adapter.kt, который переходит к рассматриваемой странице фрагмента:

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
        }
    }
}

1 ответ

Вы должны переопределить метод onBackPressed() в действии и обработать фрагментные транзакции с помощью своего ручного кода. Если бы вы могли поделиться некоторыми фрагментами операций и фрагментами транзакций, это поможет мне найти правильное решение.

Привет, это то, что я обычно делаю: в упражнении найдите navController из вашего navHostFragment

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()
}
Другие вопросы по тегам