17

我对导航组件如何适应应用程序行为感到有些困惑。在教程中这一切看起来都很好而且很闪亮,你不会做太复杂的事情,但是在真正的应用程序中实现时,事情似乎有所不同。

导航前

在实现导航之前,我必须手动运行片段事务。为了做到这一点,我的片段将实现一个接口,该接口onFragmentAction将 a 传递bundle给主片段Activity,并在基于动作的活动中,用另一个片段替换当前片段。

需要处理的第二部分是顶部工具栏和BottomAppBar. 例如BottomAppBar,需要FAB在某些片段上以不同方式对齐或隐藏在其他片段中。此外,顶部ToolBar需要在某些上展开或在其他上折叠。为此,我听取FragmentManager.OnBackStackChangedListener并根据片段标签getSupportFragmentManager().getBackStackEntryAt(size - 1).getName()相应地更改布局。

带导航

第一部分似乎很容易做到:传递参数并开始新的片段。但我不知道导航是否可以处理工具栏管理,或者我需要继续从我的活动中管理它。

4

4 回答 4

21

尽管 Alex 的解决方案有效,但出于管理工具栏的目的,我不推荐使用它。

工具栏应该是片段布局的一部分,每个片段都应该管理自己的工具栏。您可以为每个片段膨胀不同的菜单。即使在想要在活动中使用工具栏的情况下,我也建议获取对工具栏表单活动的引用(通过界面),然后在片段本身中添加和操作其项目。

这将使您的活动和片段分离(这是拥有导航图和路由器的目标之一)。一个好的经验法则是,假设您想删除片段,那么您不需要对活动进行任何更改。

于 2018-07-24T01:23:24.083 回答
7

工具栏标题是根据导航图中的“标签”值设置的,如果你想用工具栏或 BottomAppBar 做一些不同的事情,你可以在你的活动中添加 addOnNavigatedListener,并根据当前目的地做一些事情。

findNavController(nav_host_fragment).addOnNavigatedListener { controller, 
 destination ->
 when(destination.id) {
    R.id.destination1 -> {
        //Do something with your toolbar or BottomAppBar
    }
    R.id.destination2 -> {
        //Do something with your toolbar or BottomAppBar
    }

 }
}
于 2018-07-17T09:39:04.217 回答
6

在您的片段中:

NavController navHostFragment = NavHostFragment.findNavController(this);
NavigationUI.setupWithNavController(toolbar, navHostFragment);

在此处输入图像描述

当我单击列表项 ( Explore Fragment) 上的项目时,它将否定DetailFragment,当我单击工具栏上的后退按钮时,它将返回MainFragment

于 2019-03-18T13:21:04.557 回答
3

如果您想通过调用菜单项来访问另一个片段,您必须为项目 ID 提供与目标 ID 中相同的 ID。

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return 
       item.onNavDestinationSelected(findNavController(R.id.nav_host_fragment))
            || super.onOptionsItemSelected(item)
}


<item android:id="@+id/dailyInfoFragment"
      android:title="@string/action_settings"
      android:orderInCategory="100"
      app:showAsAction="never"/>


    <fragment
        android:id="@+id/dailyInfoFragment"
        android:name="com.example.sonyadmin.infoPerDay.DailyInfoFragment"
        android:label="fragment_daily_info"
        tools:layout="@layout/fragment_daily_info"
        />
于 2019-05-07T13:17:23.917 回答