Android Jetpack Navigation: как получить экземпляр фрагмента назначения в OnNavigatedListener?

Я использую компоненты навигации Jetpack при разработке Android (одно действие, много фрагментов).

Я хочу получить экземпляр фрагмента назначения в OnNavigatedListener, как показано ниже.

Является ли это возможным?

class MainActivity : AppCompatActivity() {

    private lateinit var navController: NavController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(this, R.layout.activity_main)
        navController = Navigation.findNavController(this, R.id.nav_host_fragment)
        navController.addOnNavigatedListener { controller, destination ->
            // Here
        }
    }
}

ОБНОВЛЕНИЕ: сценарий

Я хочу каждый раз получать свойство фрагмента (или возвращаемое значение из метода) в активности при переходе.

Например,

val fragment = getFragmentInstanceFromDestination()
myActionBar.visible = fragment.getActionBarVisible()

person naokiokada    schedule 13.06.2018    source источник
comment
Я не думаю, что для этого есть возможность. Я не знаю, какой сценарий хотите реализовать, но, возможно, вы можете использовать модель просмотра, прикрепленную к вашей активности, и ваши фрагменты, наблюдающие там объекты LiveData, а из NavigationListener вы обновляете эти объекты Liveata на основе идентификатора назначения и вашего фрагмента будет уведомлен и сможет «что-то сделать».   -  person Alex    schedule 13.06.2018
comment
В зависимости от вашего обновленного сценария вы должны использовать ViewModel и LiveData. добавьте в свой viewmodel параметр Liveata, например isToolbarVisible, и наблюдайте за ним из своей активности, из ваших фрагментов измените его значение, и активность будет уведомлена.   -  person Alex    schedule 13.06.2018
comment
Вы нашли решение?   -  person Viktoriia Chebotar    schedule 02.07.2018


Ответы (1)


Если вы используете версию 1.0.0-alpha07, раньше можно было сделать что-то вроде этого:

 (destination as? FragmentNavigator.Destination)?.let { destinationClass ->
            val isNewFullscreen = destinationClass.fragmentClass.superclass == FullScreenFragment::class.java
//... adjust paddings and hide action bar, etc.

Это подход, который я использовал для одного приложения Activity, имеющего два суперкласса Fragment, один из которых - FullScreenFragment (тот, который используется в примере), который скрывает панель действий и панель навигации, а также NavigationFragment (имя сбивает с толку, но здесь показаны панель навигации и панель действий).

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

Теперь с новым 1.0.0-alpha08 FragmentNavigatio.Destination.fragmentClass больше не доступен, поэтому я все еще думаю, как решить эту проблему. Я подумываю об использовании destination.id == R.id.someFullScreenFragment, это определенно менее взломано, чем то, что у меня есть на данный момент, но мне нужно будет отслеживать список идентификаторов.

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

person Jalvap    schedule 14.12.2018
comment
Есть ли обновления о новых способах получения этой ценности, как вы это делали раньше? В настоящее время используется версия 1.0.0, поэтому не удается получить необходимый фрагмент. - person John Shelley; 30.04.2019
comment
navController.addOnDestinationChangedListener { _, destination, _ -> val isNewFullscreen = isFullscreen(destination.id) //... } Итак, теперь я просто проверяю идентификаторы мест назначения, и именно так я прикидываю, нужно ли мне переходить в полноэкранный режим или нет. После первого стабильного релиза навигационной дуги я не мог более подробно остановиться. составная часть. К сожалению, у меня нет для вас обновлений, просто я переместил свою реализацию так, как я описал во втором предложении в исходном ответе. - person Jalvap; 02.05.2019