Android Jetpack Navigation: Как получить фрагмент экземпляра места назначения в OnNavigatedListener? - PullRequest
0 голосов
/ 13 июня 2018

Я использую Jetpack Navigation Components в разработке для 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()

1 Ответ

0 голосов
/ 14 декабря 2018

Если вы используете версию 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, это определенно менее хакерски, чем то, что у меня есть на данный момент, но мне придется отслеживать список идентификаторов.

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

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