#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"
/>