【问题标题】:Android Navigation - getting navhostfragment from within hosted fragmentAndroid Navigation - 从托管片段中获取 navhostfragment
【发布时间】:2021-07-04 03:46:05
【问题描述】:

我正在创建一个简单的项目,并且正在使用导航组件。这是我想要实现的目标。我有一个导航图和单个活动,它具有充当 NavHostFragment 的 FragmentContainerView 和显示导航抽屉菜单的 NavigationView。从这个活动中,使用抽屉菜单项和导航图,我可以导航到特定的片段。这个片段包含一个底部导航视图。如何将此底部导航连接到活动的导航,以便能够按下底部导航菜单项并导航到活动导航图中的目的地?我有点用子图来做:目的地有自己的导航图,但这效果不佳,因为在按下导航返回按钮后,用户将导航回该图的起始目的地。

目前我找到的解决方案是,但是后退按钮导航仍然返回到起始目的地(在我的情况下为welcomeFragment),而不是返回到上一个目的地(TeamMainFragment),我认为这意味着目的地导航从底部导航不会添加到返回堆栈。

 @Override
public void onStart() {
    super.onStart();
    BottomNavigationView bottomNavigationView = binding.bottomNavigationView;
    NavigationUI.setupWithNavController(bottomNavigationView,Navigation.findNavController(binding.getRoot()));
}

有没有更好的解决方案?

我也试过了

    NavHostFragment navHostFragment = (NavHostFragment) getParentFragment();
    NavController navController = navHostFragment.getNavController();
    BottomNavigationView bottomNavigationView = binding.bottomNavigationView;
    NavigationUI.setupWithNavController(bottomNavigationView,navController);

仍然无法正常工作:当我在 insertTeamFragment 中并按下导航返回按钮时

它导航回welcomeFragment,而不是teamMainFragment。

感谢 Adnan 找到了解决方案:

super.onStart();
        NavHostFragment navHostFragment = (NavHostFragment) getParentFragment();
        NavController navController = navHostFragment.getNavController();
        BottomNavigationView bottomNavigationView = binding.bottomNavigationView;
        bottomNavigationView.setOnNavigationItemSelectedListener(item -> {
            navController.navigate(item.getItemId());
            return true;
        });
This works as wanted:when in insertTeamFragment and press the back navigate button it navigates back to teamMainFragment.But still don't understand why the NavigationUI solution is not working.If anyone knows,please comment.

【问题讨论】:

    标签: android android-fragments android-navigation android-navigation-graph


    【解决方案1】:

    @覆盖 公共无效 onAttach(@NonNull 上下文上下文){ super.onAttach(context);

        OnBackPressedCallback callback = new OnBackPressedCallback(true) {
            @Override
            public void handleOnBackPressed() {
                //set it navigate(current frag to previous frag)
                setRetainInstance(true);
                requireActivity().finish();
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
    }
    

    【讨论】:

    • 我觉得不是这样。我的活动中已经有抽屉导航。我希望底部导航仅在我到达某个目的地时出现,这就是为什么我将底部导航添加到目的地而不是活动。
    • 那你为什么不使用它。 BottomNavigationView bottomNavigationView= findViewById(R.id.bottom); bottomNavigationView.setOnNavigationItemSelectedListener(item -> { switch (item.getItemId()){ } });
    • 我试图让它与 NavigationUI 一起工作。它确实导航,但是当我导航回来时,而不是返回到 teamFragment 目标(当我在 insertTeamFragment 中时),它返回到 welcomeFragment,从抽屉导航导航到 teamMainFragment 的位置。
    • 然后在您的片段中手动设置我更新我的答案请查看它
    • 我确实将监听器与 navController.navigate(item.getItemId());它按我的意愿工作(后退导航按钮导航到正确的目的地),但我仍然不明白为什么它不能与 NavigationUI.NavigationUI.setupWithNavController 一起使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多