android - 如何移动到下一个 NavHostFragment?
问题描述
这应该是一个非常容易解决的问题,但我似乎无法弄清楚。
我正在使用 Jetpack 导航架构组件,尽管导航到具有在布局中不同导航主机中指定的不同导航图的不同活动,但我无法更改正在使用的导航图。
在我的应用程序中,我有 2 个活动;MainActivity.kt
和PartyActivity.kt
。它们每个都是 a 的容器,FragmentContainerView
它是NavHostFragment
NavGraph(pre_login_nav_graph.xml
和logged_in_nav_graph.xml
分别)仅在每个活动的上下文中使用的容器。和 的导航都按预期工作MainActivity
,pre_login_nav_graph
但是当我导航到PartyActivity
并完成MainActivity
时,设置新的导航主机时,它不会显示正确的开始目的地logged_in_nav_graph
,而是显示 的开始目的地pre_login_nav_graph
。
让我更加困惑的是,当我记录导航控制器的 currentDestination 是什么时,它声称它位于正确的起始目的地,logged_in_nav_graph
即使它明显不是!除非由于某种原因片段布局不可见,否则我想不出显示与导航控制器告诉我的内容之间存在这种脱节的原因。
派对活动.kt
class PartyActivity : AppCompatActivity() {
private lateinit var binding: ActivityPartyBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_party)
setupBottomNavBinding()
// set search as first active tab
binding.bottomNav.selectedItemId = R.id.searchFragment
}
override fun onStart() {
super.onStart()
findNavController(R.id.party_nav_host_fragment).navigate(R.id.partyCodeFragment)
Timber.e("${findNavController(R.id.party_nav_host_fragment).currentDestination}")
// ^ this logs the expected correct current dest but that fragment isn't shown on screen
}
private fun setupBottomNavBinding() {
binding.bottomNav.setOnNavigationItemSelectedListener { item ->
when(item.itemId) {
R.id.searchFragment,
R.id.queueFragment,
R.id.nowPlayingFragment -> {
true
// NavigationUI
// .onNavDestinationSelected(item, party_nav_host_fragment.findNavController())
}
else -> {
Timber.e("Bottom Nav selection ${item.title} not recognized")
false
}
}
}
}
}
活动派对.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.partyActivity.PartyActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/party_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottom_nav"
app:defaultNavHost="true"
app:navGraph="@navigation/logged_in_nav_graph" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:labelVisibilityMode="selected"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/bottom_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
登录的_in_nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/logged_in_nav_graph"
app:startDestination="@id/partyCodeFragment">
<fragment
android:id="@+id/partyCodeFragment"
android:name="com.niehusst.partyq.ui.partyCode.PartyCodeFragment"
android:label="PartyCodeFragment"
tools:layout="@layout/party_code_fragment" />
</navigation>
party_code_fragment.xml(的预期起始目的地logged_in_nav_graph.xml
)
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/black"
tools:context=".ui.partyCode.PartyCodeFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/temp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:text="Party code" />
</LinearLayout>
</layout>
如果您想挖掘其他文件,完整的代码库已在github上打开。
解决方案
问题原来是一个错字:(在我的片段PartyCodeFragment中,我不小心尝试使用PartyConnectFragmentBinding来膨胀布局。当自动完成出错时......
推荐阅读
- java - Java StdDraw 动画
- python - Python - 当样本大小发生变化时从数组中采样数据的快速方法
- python - 如何读取执行 Python 文件的实时输出并从 PHP 传递变量?
- node.js - 使用节点 js 连接到 mongoDB 时出现连接超时错误
- c# - 在 Swagger 中重用定义
- python - 根据包装器签名传递给金字塔视图函数的参数不一致
- angular - Angular 6如何检查我的管道过滤器是否返回一个空数组
- javascript - 在传递一些变量参数时,我如何正确使用 onclick() 方法,即在这种情况下的参数是 Mongoose 对象文档的 ID?
- python - 用熊猫读取excel文件
- node.js - 无法读取 csv 解析器中未定义的属性管道