Android Jetpack导航如何处理工具栏和BottomNavBar内容

时间:2018-07-17 08:17:44

标签: android android-architecture-components android-jetpack android-architecture-navigation

我对导航组件如何适应应用行为感到有些困惑。在教程中,您所做的事情并没有太复杂,但是在实际应用中实施时,情况似乎有所不同。

导航之前

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

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

具有导航功能

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

工具栏标题是根据导航图内的“标签”值设置的,如果您想对工具栏或BottomAppBar进行其他操作,则可以在活动中添加addOnNavigatedListener并根据当前目标进行操作。

override func didMove:-

self.physicsBody = borderBody 
self.physicsWorld.speed = 1;
physicsWorld.gravity = CGVector(dx: 0, dy: 0)

let ball = scene.childNode(withName: "ball") as! SKSpriteNode
ball.physicsBody!.applyImpulse(CGVector(dx: 0, dy: -2))

答案 2 :(得分:1)

这是我解决的: 在您的片段中:

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

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

答案 3 :(得分:0)

如果要通过调用菜单项来到达另一个片段,则必须为项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"
        />