Настраиваемое поведение «навигации вверх» для определенного фрагмента с использованием компонента «Навигация» - PullRequest
2 голосов
/ 29 апреля 2019

Я хочу добавить пользовательскую вверх навигацию из фрагмента, используя компонент Навигация

В моем build.gradle(app) я использую androidx.appcompat:appcompat:1.1.0-alpha04 зависимость, чтобы иметь доступ к onBackPressedDispatcher от активности.

Итак, я реализовал OnBackPressedCallback в своем фрагменте и зарегистрированный обратный звонок диспетчеру:

requireActivity().onBackPressedDispatcher.addCallback(this)

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

Есть ли аналогичный способ добавить некоторый обратный вызов во фрагменте при перемещении вверх?

UPDATE

переопределенные методы onOptionsItemSelected и onSupportNavigateUp не вызывается при нажатии кнопка вверх на панели инструментов

Ответы [ 3 ]

2 голосов
/ 29 апреля 2019

Вам необходимо позвонить onBackPressed() из onBackPressedDispatcher собственности. Если ваша панель инструментов настроена правильно, вы можете использовать приведенный ниже код в своей деятельности.

override fun onOptionsItemSelected(menuItem : MenuItem?) : Boolean {
    if (menuItem.getItemId() == android.R.id.home) {
        onBackPressedDispatcher.onBackPressed()
    }
    return super.onOptionsItemSelected(menuItem)
}

Что это делает:

Инициировать вызов на добавленный в данный момент OnBackPressedCallback обратные вызовы в обратном порядке, в котором они были добавлены. Только если наиболее false от его OnBackPressedCallback#handleOnBackPressed() будет ли вызываться любой ранее добавленный обратный вызов.

Я использую AndroidX в моем примере, поэтому мой импорт будет выглядеть как

import androidx.appcompat.app.AppCompatActivity.

1 голос
/ 01 мая 2019

Я нашел решение

handleOnBackPressed() метод вызывается только при нажатии кнопки устройства назад. Интересно, почему ни методы onOptionsItemSelected(), ни onSupportNavigateUp() не были вызваны при нажатии кнопки "вверх" на панели инструментов. И ответ я использовал

NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration)

в действии по настройке панели инструментов с компонентом навигации. И это сделало панель инструментов отзывчивой для работы с внутренней навигацией, нажатие кнопки «вверх» не вызвало переопределенных методов в деятельности или фрагментах.

Вместо этого следует использовать

NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration)

Это сделает actionBar отзывчивым для навигации, поэтому я могу использовать переопределенные функции onOptionsItemSelected() и onSupportNavigateUp() И лучшее место (в моем случае) для добавления пользовательского поведения при нажатии кнопки «вверх» для определенного экрана -

onSupportNavigateUp()

размещенных действий, например

override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.mainNavHostFragment)
        return when(navController.currentDestination?.id) {
            R.id.destinationOfInterest -> {
                // custom behavior here 
                true
            }
            else -> navController.navigateUp()
        }
}

Но стоит сказать, что если вы хотите реализовать собственное поведение непосредственно во фрагменте, ответ @Enzokie должен работать как шарм

0 голосов
/ 29 апреля 2019

Таким образом добавьте событие клика на кнопку "Назад" на панели инструментов

@Override
public boolean onOptionsItemSelected(MenuItem item) {
 switch (item.getItemId()) {
case android.R.id.home:
    // Toolbar back button pressed, do something you want    

default:
    return super.onOptionsItemSelected(item);
  }
}

Другой способ

  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    // Title and subtitle
    toolbar.setNavigationOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // Toolbar back button pressed, do something you want    
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...