Как найти navcontroller с привязкой к виду?

#java #android #android-navigation #android-navigationview

Вопрос:

Я использую привязку представления в своем приложении. Но теперь я столкнулся с проблемой поиска navcontroller с привязкой представления.

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

 Navigation.findNavController(this, R.id.nav_host_fragment)
 

Но если я использую привязку представления для установки представления содержимого, как я могу найти navcontroller, так как для приведенного выше кода требуется идентификатор NavHostFragment, но view bending возвращает фрагмент, если я дам binding.navHostFragment

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

1. это та же строка, она не должна отличаться, и вы все равно должны использовать эту строку кода, в чем дело Navigation.findNavController(this, R.id.nav_host_fragment) ?

Ответ №1:

ViewBinding Как следует из его названия , используется для привязки представлений, а не для привязки идентификаторов ресурсов.

То, что ViewBinding предлагает вам в своей простой форме, вам больше не нужно findViewById(view_id) ; вместо этого оно предлагает binding.myView .. В обоих случаях возвращается представление.

Но в данном NavController контексте вам не нужно получать представление (но идентификатор ресурса), поэтому привязка представления не принесет вам пользы (опять же, потому что она связывает представления, а не идентификаторы).

Таким образом, вам придется использовать тот же код, чтобы получить NavController :

 Navigation.findNavController(this, R.id.nav_host_fragment)
 

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

1. до того, как я получу ошибку, но теперь это работает. Может быть, я что-то упускаю.

Ответ №2:

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

итак, в качестве примера вы должны изменить это :

         <fragment
        android:id="@ id/mainFragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/mobile_navigation" />
 

в это :

         <androidx.fragment.app.FragmentContainerView
        android:id="@ id/fragmentContainerView"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/mobile_navigation"
        />