我有一个片段,我在其中定义了一个NavHostFragment,如下所示:
import datetime
datetime.datetime.strptime('Wednesday 06 November 2019 03:05:42 PM CDT', '%A %d %B %Y %I:%M:%S %p CDT')
当试图在片段中调用findNavController方法时,它抛出了非法状态异常,并说我的视图组没有NavController。
<fragment
android:id="@+id/shipping_host_nav"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/shipping_nav_graph"
app:defaultNavHost="true"/>
所以我的问题是:我可以在另一个片段内定义一个NavHostFragment吗? 或仅适合活动? 我进行了很多搜索,可以在另一个片段中定义导航主机片段,但没有找到任何答案。
答案 0 :(得分:3)
我找到了解决此异常的方法,当试图在非NavHostFragment或不在NavHostFragment的片段中调用此方法时,findNavController()会引发此异常,因此我在片段中调用此方法而犯了此错误。
所以我必须使用Navigation类
Navigation.findNavController(activity, R.id.my_nav_host_fragment)
这是查找片段中定义的NavHostFragment(NavController)的方法
我为Fragment类制作了扩展功能,因此我可以轻松地使用id查找导航控制器
fun Fragment.getFragmentNavController(@IdRes id: Int) = activity?.let {
return@let Navigation.findNavController(it, id)
}