【问题标题】:Fragment no visible if using fragment manager and nav controller如果使用片段管理器和导航控制器,片段不可见
【发布时间】:2019-09-13 00:33:09
【问题描述】:

我正在尝试使用单个 Activity 构建应用。

在我的主片段中,一旦用户点击一个按钮,我需要在当前主片段中设置一个片段(使用片段管理器),同时我导航到另一个片段(使用 nav comp)

片段管理器代码:

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>

问题是在导航控制器进行导航时,当我按下返回箭头时,使用片段管理器插入的片段不可见,protocolRunningCompagFragment.isVisible 等于 false

经过大量测试,我注意到如果我使用commitNow() 而不是commit(),我可以看到插入的片段一秒钟,然后它执行导航。但是当我回来时,片段是不可见的。

它必须是片段管理器和导航控制器之间的东西,因为如果我注释掉导航控制器的代码,片段插入没有问题。

我对 android 有点陌生,所以如果我在做一些野蛮的事情,对不起:)

【问题讨论】:

  • 可以显示onBackPressed()方法代码吗?
  • 我没有任何 onBackPressed() 方法,我应该有一个吗?当我按下后退按钮时,navController 中的动画是正确的。

标签: android android-fragments kotlin android-architecture-navigation


【解决方案1】:

嗯,我想我找到了答案。

问题是我使用的是fragmentManager,而实际上我应该使用childFragmentManager

据我所知,childFragmentManager 处理片段内部的片段:Return a private FragmentManager for placing and managing Fragments inside of this Fragment.

所以现在可以了:

        val fragment = ProtocolRunningCompaqFragment.newInstance()
        fragment.arguments = bundle

        childFragmentManager
                .beginTransaction()
                .add(R.id.fragmentProtocolRunningCompaqContainer, fragment, PROTOCOL_RUNNING_COMPAQ_FRAGMENT_TAG)
                .commit()

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 2023-02-14
    • 2019-10-02
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多