NullPointerException при попытке получить NavController

Не могу понять, в чем причина ошибки java.lang.NullPointerException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment

Это мой хост-фрагмент:

class HostFragment : Fragment() {
    
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment_host, container, false)

        // error here
        val navHostFragment = requireActivity().supportFragmentManager.findFragmentById(R.id.hostFragment) as NavHostFragment
        //

        val navController = navHostFragment.navController

        root.host_text_view.setOnClickListener {
            Log.d("Tag", "clicked")

            navController.navigate(R.id.action_hostFragment_to_secondFragment)
        }

        return root
    }
}

Я хочу перейти к SecondFragment, щелкнув textView. И назад.

И файл .xml nav graph:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/hostFragment">

    <fragment
        android:id="@+id/hostFragment"
        android:name="com.example.test.HostFragment"
        android:label="fragment_host"
        tools:layout="@layout/fragment_host" >
        <action
            android:id="@+id/action_hostFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>

    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.test.SecondFragment"
        android:label="fragment_second"
        tools:layout="@layout/fragment_second" >
        <action
            android:id="@+id/action_secondFragment_to_hostFragment"
            app:destination="@id/hostFragment" />
    </fragment>
</navigation>

Граф навигации имеет окончательный вид:  введите описание изображения здесь


person MaxB    schedule 04.10.2020    source источник
comment
supportFragmentManager.findFragmentById(R.id.hostFragment) ищет Фрагмент на android:id="@+id/hostFragment" в макете вашего Действия. Можете ли вы включить макет своей деятельности и где вы добавили свой NavHostFragment в свой макет?   -  person ianhanniballake    schedule 04.10.2020


Ответы (2)


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

чтобы избежать этого, вы можете использовать OnViewCreated () как

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
       super.onViewCreated(view, savedInstanceState)
       navController = Navigation.findNavController(view)
    
       view.imgNumbrLookUp.setOnClickListener { 
            navController.navigate(R.id.action_homeFragment_to_webActivity) 
       }       
}
person amimic11    schedule 04.10.2020
comment
Навигация предлагает методы для получения NavController непосредственно из самого фрагмента в соответствии с документацией. , нет причин использовать методы просмотра. - person ianhanniballake; 04.10.2020
comment
youtube.com/watch?v=IEO2X5OU3MY для справки. - person amimic11; 07.10.2020

Вам не нужно искать свой navHostFragment для навигации

val root = inflater.inflate(R.layout.fragment_host, container, false)

        
        root.host_text_view.setOnClickListener {
            Log.d("Tag", "clicked")


            if (findNavController().currentDestination?.id == hostFragment)
            findNavController().navigate(R.id.action_hostFragment_to_secondFragment)

        }

Вы можете проверить методы Kotlin для навигации по https://developer.android.com/guide/navigation/navigation-navigate

person Eren Tüfekçi    schedule 04.10.2020