Показать подтверждение при резервном копировании во фрагменте с компонентом архитектуры навигации - PullRequest
0 голосов
/ 13 декабря 2018

Я использую компонент архитектуры навигации для Android.

Для одного из моих фрагментов я хочу перехватить навигацию «назад» и «вверх», чтобы я мог показать диалоговое окно подтверждения, прежде чем отменить любые несохраненные изменения.пользователем.(То же поведение, что и у приложения «Календарь» по умолчанию при нажатии кнопки вверх / вверх после редактирования сведений о событии)

Мой текущий подход (непроверенный) следующий:

Для навигации «вверх» я переопределяю onOptionsItemSelected на фрагменте:

override fun onOptionsItemSelected(item: MenuItem?): Boolean {
    if(item?.itemId == android.R.id.home) {
        if(unsavedChangesExist()) {
            // TODO: show confirmation dialog
            return true
        }
    }
    return super.onOptionsItemSelected(item)
}

Для «обратной» навигации я создал пользовательский интерфейс и систему обратного вызова между фрагментом и его активностью:

interface BackHandler {
    fun onBackPressed(): Boolean
}

class MainActivity : AppCompatActivity() {
    ...

    val backHandlers: MutableSet<BackHandler> = mutableSetOf()

    override fun onBackPressed() {
        for(handler in backHandlers) {
            if(handler.onBackPressed()) {
                return
            }
        }
        super.onBackPressed()
    }

    ...
}

class MyFragment: Fragment(), BackHandler {
    ...

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is MainActivity) {
            context.backHandlers.add(this)
        }
    }

    override fun onDetach() {
        (activity as? MainActivity)?.backHandlers?.remove(this)
        super.onDetach()
    }

    override fun onBackPressed(): Boolean {
        if(unsavedChangedExist()) {
            // TODO: show confirmation dialog
            return true
        }
    }

    ...
}

Это все довольно грубои пример для такой простой вещи.Есть ли лучший способ?

Ответы [ 3 ]

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

Начиная с androidx.appcompat:appcompat:1.1.0-beta01, для перехвата кнопки возврата с компонентом навигации необходимо добавить обратный вызов к OnBackPressedDispatcher.Этот обратный вызов должен расширять OnBackPressedCallback и переопределять handleOnBackPressed.OnBackPressedDispatcher следует схеме цепочки ответственности для обработки обратных вызовов.Другими словами, если вы установите обратный вызов как enabled , будет выполняться только ваш обратный вызов.В противном случае OnBackPressedDispatcher проигнорирует его и перейдет к следующему обратному вызову и т. Д., Пока не найдет включенный (например, это может быть полезно, когда у вас более одного обратного вызова).Подробнее об этом здесь .

Итак, чтобы показать диалог, вам нужно сделать что-то похожее на это:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  super.onViewCreated(view, savedInstanceState)

  val callback = object : OnBackPressedCallback(true /** true means that the callback is enabled */) {
    override fun handleOnBackPressed() {
        // Show your dialog and handle navigation
    }
  }

  // note that you could enable/disable the callback here as well by setting callback.isEnabled = true/false

  requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback)
}

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

0 голосов
/ 01 августа 2019

для навигации вверх просто переопределить onOptionsItemSelected ()

override fun onOptionsItemSelected(item: MenuItem): Boolean =
    when (item.itemId) {
        android.R.id.home -> {
            showDialog() // show your dialog here
            true
        }
        else -> super.onOptionsItemSelected(item)
}
0 голосов
/ 03 января 2019

Если вы используете его с AppBarConfiguration, в последнем выпуске теперь есть AppBarConfiguration.OnNavigateUpListener.Обратитесь к ссылке ниже для получения дополнительной информации

https://developer.android.com/reference/androidx/navigation/ui/AppBarConfiguration.OnNavigateUpListener

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