Как обработать кнопку вверх на панели инструментов - Kotlin - PullRequest
0 голосов
/ 30 июня 2018

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

UPDATE:

Комментарий к другой ТАКОЙ записи имеет потенциальное решение в Котлине. Он ловит щелчок на кнопке вверх и возвращается на предыдущую страницу фрагмента, но затем кнопка вверх не исчезает. Таким образом, кнопка «вверх» теперь сохраняется даже в местах назначения фрагментов верхнего уровня в моем приложении (страницы, соответствующие каждой вкладке в 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
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Привет, это то, что я обычно делаю: в действии найдите 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()
}
0 голосов
/ 30 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...