Android 如果使用碎片管理器和导航控制器,碎片不可见
我正在尝试用单个活动构建一个应用程序 在我的主片段中,一旦用户点击一个按钮,我需要在当前主片段中设置一个片段(使用片段管理器),同时导航到另一个片段(使用nav comp) 片段管理器代码:Android 如果使用碎片管理器和导航控制器,碎片不可见,android,android-fragments,kotlin,android-architecture-navigation,Android,Android Fragments,Kotlin,Android Architecture Navigation,我正在尝试用单个活动构建一个应用程序 在我的主片段中,一旦用户点击一个按钮,我需要在当前主片段中设置一个片段(使用片段管理器),同时导航到另一个片段(使用nav comp) 片段管理器代码: fragmentManager?.let { fragmentManager -> val fragment = ProtocolRunningCompaqFragment.newInstance() fragment.arguments = bund
fragmentManager?.let { fragmentManager ->
val fragment = ProtocolRunningCompaqFragment.newInstance()
fragment.arguments = bundle
val transaction = fragmentManager.beginTransaction()
fragmentManager
.beginTransaction()
.add(R.id.fragmentProtocolRunningCompaqContainer, fragment, PROTOCOL_RUNNING_COMPAQ_FRAGMENT_TAG)
.commit()
Log.d("FragmentManager", "count: ${fragmentManager.backStackEntryCount}")
}?: run {
Log.d("Error","The fragment manager is not available")
}
之后,在同一线程中,我执行以下操作:
findNavController().navigate(directions)
这是主片段管理器的布局,我和我将新片段插入fragmentProtocolRunningCompaqContainer
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ProtocolListFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@drawable/black_border"
android:id="@+id/fragmentProtocolRunningCompaqContainer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/progressBar">
</FrameLayout>
....
</FrameLayout>
....
问题是,当导航控制器执行导航时,当我按下后退箭头时,插入片段管理器的片段不可见,而协议runningcompagfragment.isVisible
等于false
经过大量测试,我注意到如果我使用commitNow()
而不是commit()
,我可以看到插入的片段一秒钟,然后它执行导航。但是当我回来的时候,碎片是看不见的
它必须介于片段管理器和导航控制器之间,因为如果我注释掉导航控制器的代码,那么插入片段时不会出现任何问题
我对安卓系统有点陌生,所以,如果我做了一些野蛮的事情,很抱歉:)我想我找到了答案 问题是我使用的是
fragmentManager
,而实际上我应该使用childFragmentManager
正如我所理解的,childFragmentManager
处理片段内部的片段:返回一个私有片段管理器,用于在片段内部放置和管理片段。
所以现在它起作用了:
val fragment = ProtocolRunningCompaqFragment.newInstance()
fragment.arguments = bundle
childFragmentManager
.beginTransaction()
.add(R.id.fragmentProtocolRunningCompaqContainer, fragment, PROTOCOL_RUNNING_COMPAQ_FRAGMENT_TAG)
.commit()
你能展示onBackPressed()方法代码吗?我没有任何onBackPressed()方法,我应该有一个吗?当我按下后退按钮时,navController中的动画已正确完成。