#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
самостоятельно. Вы просто указываете aNavHostFragment
и anavGraph
, и 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. Спасибо за ваши ответы и помощь Гэвину. Я принял ваш ответ и поддержал его.