Вопрос о понимании NavController в Android

#android #navigation #android-jetpack

#Android #навигация #android-реактивный ранец

Вопрос:

Я только начал использовать навигацию Jetpack в Android, и у меня есть вопрос. У меня есть следующий метод внутри фрагмента, который реализует View.OnClickListener

 public void onClick(View view) {

    if(view.getId() == R.id.imageButton_Softdrinks_en) {

        int amount = 1;
        Menu_FragmentDirections.ActionMenuFragmentToSoftdrinks action = Menu_FragmentDirections
                .actionMenuFragmentToSoftdrinks(amount);

        Navigation.findNavController(view).navigate(action);



    }

}
  

В основном метод работает, но я действительно не понимаю, почему. Представление в объявлении метода должно быть ImageButtons. При использовании команды: «Navigation.findNavController (просмотр)» Android ищет Navcontroller представления. Учитывая, что view является ImageButtom, я не понимаю, почему работает навигация. У ImageButtoms нет NavController или NavHost. Кто-нибудь не возражает объяснить это мне. Я был бы признателен за каждый комментарий и был бы весьма благодарен за вашу помощь.

Ответ №1:

Вы можете вызвать Navigation.findNavController(View) любой View в View иерархии. Затем система будет перемещаться вверх по иерархии, пока не найдет родительский Fragment ( NavHostFragment ), а затем найдет NavController NavHostFragment .

Комментарии:

1. Спасибо, Гэвин, за ваш комментарий. Но сам вид — это дно изображения. Кроме того, я не реализовал NavController, и даже в файле XML-макета контейнера acticity я ничего не указываю о NavController. Я просто использую тег «app: defaultNavHost=»true»» внутри фрагмента. Так что я все еще совершенно не понимаю, почему все работает именно так. Как Android узнает, где найти NavController и что представление в описании метода — это не то представление, которое он должен искать для NavController (потому что это ImageBottom без каких-либо элементов навигации)

2. Вы не реализуете NavController самостоятельно. Вы просто указываете a NavHostFragment и a navGraph , и Android заботится о замене Fragments при навигации между ними. ImageButton является дочерним элементом Fragment , и это Fragment является пунктом назначения в navGraph . Таким образом, он может найти navController из любого View , содержащегося в любом пункте назначения Fragments . Он делает это, просто перемещаясь вверх по View иерархии.

3. Спасибо Гэвину за ваши комментарии и усилия. Итак, могу ли я просто всегда использовать код «Navigation.findNavController (view).navigate (action); » в любом методе, и он будет перемещаться в нужное место (указанное в NavGraph)?

4. Да, предполагая, что вы находитесь внутри a, ClickListener который предоставляет View , или у вас есть View ссылка из какого-либо другого средства. Вы также можете вызвать findNavController(this).navigate(action) , который является методом Fragment класса. По сути, это одно и то же.

5. Спасибо за ваши ответы и помощь Гэвину. Я принял ваш ответ и поддержал его.