пользовательская кнопка «Назад» — навигация Android

У меня есть форма, и я хочу получить подтверждающее сообщение от пользователя, прежде чем пользователь покинет ее.

я хочу предоставить пользовательскую кнопку «Назад», когда пользователь касается этой кнопки:

кнопка возврата назад в Android

я пробую это:

val onBackPressedCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
            }
        }
requireActivity().onBackPressedDispatcher.addCallback(this,onBackPressedCallback)

но, кажется, работает только для обеспечения пользовательского поведения кнопки «Назад» встроенного программного/аппаратного обеспечения, а не кнопки со стрелкой «Назад».

Как я могу это сделать?


person peyman    schedule 13.10.2019    source источник
comment
в java мы делаем это так: stackoverflow.com/questions/36457564/, просто преобразуйте ее в kotlin.   -  person L2_Paver    schedule 14.10.2019


Ответы (3)


Используйте onSupportNavigateUp и замените yourCurrentFragmentID на текущий идентификатор фрагмента. Все это нужно делать в MainActivity.

 navController = findNavController(R.id.nav_host_fragment)

 setupActionBarWithNavController(navController!!)

 override fun onSupportNavigateUp(): Boolean {
        return when(navController?.currentDestination?.id) {
            R.id.yourCurrentFragmentID -> {
                showDialog()
                true
            }
            else -> navController?.navigateUp()!!
        }
    }

Изменить

Если ваш фрагмент уже использует onOptionsItemSelected, вы можете обработать логику, проверив itemId.

 override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val id = item.itemId
        if (id == R.id.save) {
           // your save button code logic 
        }else if(id ==android.R.id.home){ 
            // display confirmation message
        }
        return super.onOptionsItemSelected(item)
    }
person John Joe    schedule 14.10.2019
comment
спасибо, это кнопка возврата, но что мне делать, если я хочу выполнить некоторые операции, требующие информации о форме фрагмента? - person peyman; 14.10.2019
comment
Вы имеете в виду, что хотите передать информацию о фрагменте в подтверждающее сообщение? - person John Joe; 14.10.2019
comment
да, например, показать некоторые данные в диалоговом окне или запустить функцию, которая требует данных формы фрагмента - person peyman; 14.10.2019
comment
спасибо, это я хочу, и отметьте это как правильный ответ. могу ли я перестать запускать navController.navigateUp() во фрагменте. я могу navigateUp с findNavController().navigateUp() но как мне это остановить? - person peyman; 14.10.2019
comment
Извините, это была ошибка с моей стороны. Я должен использовать код, чтобы предотвратить выполнение навигации, которую вы опубликовали раньше :) - person peyman; 14.10.2019
comment
Вы действительно можете игнорировать мой первый ответ. Используйте второй ответ достаточно хорошо, чтобы идти. - person John Joe; 14.10.2019
comment
я имею в виду, что я должен отключить navigateUp для этого фрагмента в `активности`, потому что, когда я нажимаю на диалоговое окно back arrow icon, отображается диалоговое окно, и я возвращаюсь к предыдущему фрагменту, пока диалоговое окно все еще существует. если я хочу остаться в текущем фрагменте, я должен отключить navigateUp или это можно сделать во фрагменте? - person peyman; 14.10.2019
comment
Вернитесь к предыдущему фрагменту, если нажата кнопка ok в диалоговом окне. В противном случае сделайте так, чтобы он оставался в текущем фрагменте. - person John Joe; 15.10.2019

Используйте этот код, чтобы установить активность при обратном нажатии.

override fun onBackPressed() {
        if (isDiscardChanges) {
            discardDialog()
        } else {

            super.onBackPressed()
        }
    }
person Chintan    schedule 14.10.2019

Если вы хотите вернуться только из Activity, вы можете добавить в AndroidManifest.xml дочерний класс Activity.

android:parentActivityName="Parent_Activity_Name 
person rachna    schedule 14.10.2019