android-fragments KotlinsupportFragmentManager无法在Fragment类中调用其他片段

33qvvth1  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(215)

我基本上是尝试用一个按钮从另一个片段调用一个片段。我用supportFragmentManager来实现这个。但是当我尝试使用它时,它给我
未解析的引用:支持片段管理器
错误。即使我添加了requireActivity().supportFragmentManager,它也没有给我任何关于supportFragmentManager的错误,但这次有一个关于replace方法的错误。它给了我
类型不匹配:推断类型为FilterFragment,但应为Int
错误。我想从那个布局转到另一个布局。所以它必须是这个,但是当我把我的supportFragmentManager转换成requireActivity().supportFragmentManager时,它需要int。我不知道如何解决这个问题。
这是我的FilterFragment类,通过单击按钮转到ListFragment类

class FilterFragment : Fragment(R.layout.fragment_filter) {
    private lateinit var fragment_list:ListFragment
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        fragment_list= ListFragment()
        
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        btn_back.setOnClickListener {
            loadFragment(fragment_list)
        }

    }
    private fun loadFragment(fragment: Fragment){
        val transaction = requireActivity().supportFragmentManager.beginTransaction()
        transaction.replace(this, fragment)
        transaction.disallowAddToBackStack()
        transaction.commit()
    }

}

和我的列表片段类

class ListFragment : Fragment(R.layout.fragment_list) {

    object KEY {
        const val KEY_NAVIGATOR = "NAVIGATOR"
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val bundle = this.arguments
        if (bundle != null) {
            val navigator : ListNavigator = bundle.getSerializable(KEY_NAVIGATOR) as ListNavigator
            navigator.navigateFilter()
        }
    }

}

编辑:
在添加下面的代码后,我修复了这个错误。

private fun loadFragment(fragment: Fragment){

       /* parentFragmentManager.beginTransaction().apply {
            replace(fragmentContainerView.id,fragment,ListFragment::class.java.simpleName)
                .addToBackStack(null).commit()

        }*/
        val transaction = getChildFragmentManager().beginTransaction()
        transaction.add(fragmentContainerView.id, fragment)
        transaction.disallowAddToBackStack()
        transaction.commit()
        Log.d("JUPITER","I AM HERE")
    }

并且还将android:id="@+id/fragmentContainerView"代码添加到我的fragment_filter.xml中
但是仍然不能很好地加载到我的片段。它看起来像下面。当我点击按钮时,它试图加载与第一个片段在同一页面的其他片段。The Situation which I face now
Before I click the button

gywdnpxw

gywdnpxw1#

您必须使用childFragmentManager或parentFragmentManager,而不是supportFragmentManager,这取决于您的使用情况,因为您试图从另一个片段调用一个片段。
例如

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

相关问题