【问题标题】:Comprehension question about the NavController in Android关于Android中NavController的理解题
【发布时间】:2020-08-27 10:39:13
【问题描述】:

我刚开始在 Android 中使用 Jetpack Navigation,我有一个问题。我在实现 View.OnClickListener 的 Fragment 中有以下方法

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);



    }

}

基本上该方法有效,但我不明白为什么。方法声明中的 View 应该是 ImageButtons。使用命令时:“Navigation.findNavController(view)” Android 会搜索视图的 Navcontroller。鉴于视图是 ImageButtom 我不明白为什么导航有效。 ImageButtoms 没有 NavController 或 NavHost。有人介意向我解释一下吗。感谢您的每一条评论,并非常感谢您的帮助。

【问题讨论】:

    标签: android navigation android-jetpack


    【解决方案1】:

    您可以在View 层次结构中的任何View 上调用Navigation.findNavController(View)。然后系统将向上遍历层次结构,直到找到父FragmentNavHostFragment),然后找到NavHostFragment的NavController。

    【讨论】:

    • 感谢加文的评论。但是视图本身是一个 ImageBottom。此外,我还没有实现 NavController,甚至在容器活动的 XML 布局文件中,我也没有指定任何关于 NavController 的内容。我只是在片段中使用标签“app:defaultNavHost="true"”。所以我仍然很困惑为什么事情会这样。 Android 如何知道在哪里可以找到 NavController 以及方法 descprtion 中的视图不是它应该寻找 NavController 的视图(因为它是一个没有任何 Nav 元素的 ImageBottom)
    • 您自己没有实现NavController。您只需指定NavHostFragmentnavGraph,Android 会在您在它们之间导航时替换掉FragmentsImageButtonFragment 的子代,而 FragmentnavGraph 中的目的地。所以它可以从包含在任何目标Fragments 中的任何View 中找到navController。它通过简单地向上遍历View 层次结构来做到这一点。
    • 感谢 Gavin 的 cmets 和努力。那么我是否可以始终在任何方法中使用代码“Navigation.findNavController(view).navigate(action);”,它会导航到正确的位置(在 NavGraph 中指示)?
    • 是的,假设您在提供ViewClickListener 中,或者您有来自其他方式的View 引用。也可以调用findNavController(this).navigate(action),这是Fragment类的一个方法。它们基本上是一样的。
    • 感谢您的回答和帮助加文。我接受了你的回答并投了赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2011-08-21
    • 1970-01-01
    相关资源
    最近更新 更多