我对导航组件如何适应应用行为感到有些困惑。在教程中,您所做的事情并没有太复杂,但是在实际应用中实施时,情况似乎有所不同。
导航之前
在实施导航之前,我必须手动运行片段事务。为了做到这一点,我的片段将实现一个接口onFragmentAction
,该接口将bundle
传递给主Activity
,并在基于操作的活动中,用另一个片段替换当前片段。
需要处理的第二部分是顶部工具栏和BottomAppBar
。例如,BottomAppBar
需要使FAB
在某些片段上对齐不同或在其他片段中隐藏。另外,顶部的ToolBar
需要在某些位置扩展或在其他位置折叠。为此,我听了FragmentManager.OnBackStackChangedListener
,并根据片段标签getSupportFragmentManager().getBackStackEntryAt(size - 1).getName()
相应地更改了布局。
具有导航功能
第一部分似乎很容易做到:传递参数并开始新的片段。但是我不知道导航是否可以处理工具栏管理,或者我需要继续从“活动”中进行管理。
答案 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);
当我单击列表项(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"
/>