如何用 Android 数据绑定替换 androidx.fragment.app.FragmentContainerView 中的片段

Posted

技术标签:

【中文标题】如何用 Android 数据绑定替换 androidx.fragment.app.FragmentContainerView 中的片段【英文标题】:How to replace fragment in androidx.fragment.app.FragmentContainerView with Android databinding 【发布时间】:2022-01-08 06:02:55 【问题描述】:

我当前的 android 应用程序使用数据绑定。

我在尝试将片段添加到 androidx.fragment.app.FragmentContainerView 时遇到问题。

我已经达到了我想要的效果,但是感觉方法不对。

我不明白我在哪里犯了错误。

在我的活动onCreate 方法中,我执行此代码来设置所需的片段

 override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

        if (savedInstanceState == null) manageFragment()
    

manageFragment() 函数与此类似

private fun manageFragment() 
    val myFragment = MyFragment.instance()

    when 
        (currentFragment == null) -> supportFragmentManager
            .beginTransaction()
            .replace(R.id.my_fragment_container, myFragment)
            .commit()

        (currentFragment is MyFragment) -> doNothing()

        else -> supportFragmentManager
            .beginTransaction()
            .replace(R.id.my_fragment_container, myFragment)
            .commit()
    

当我在manageFragment() 之后检查时,此方法在onCreate() 中返回 null

supportFragmentManager.findFragmentById(R.id.my_fragment_container)

但是,当我在 onPostCreate() 中调用相同的方法时

override fun onPostCreate(savedInstanceState: Bundle?) 
    super.onPostCreate(savedInstanceState)
    currentFragment = supportFragmentManager.findFragmentById(R.id.my_fragment_container)

它有我的片段集

这是我应该如何添加/重新[使用数据绑定时放置片段?

为什么我的片段直到postCreate() 才返回

我有一种感觉,因为一旦我提交片段事务以将我的片段添加到FragmentContainerView,仍然需要测量布局等。所以在findFragmentById() 可以返回我添加的片段之前“一段时间”过去了。

是否有我可以添加到FragmentContainerView 的布局侦听器来检测我的片段何时实际添加并变得可见?

【问题讨论】:

【参考方案1】:

为什么我的片段直到 postCreate() 才返回

Commit is asynchronous

是否有我可以添加到 FragmentContainerView 的布局侦听器来检测我的片段何时实际添加并变得可见?

你为什么关心这个?

【讨论】:

我还以为是这样的。我在乎,因为我认为我做错了什么。我没有意识到 commit() 不是即时的,我的一个简单错误

以上是关于如何用 Android 数据绑定替换 androidx.fragment.app.FragmentContainerView 中的片段的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何用另一个字符串替换部分字符串?

如何用 ViewPager 中的另一个片段替换 Android 片段?

Cordova android - 如何用生成的替换自定义 build.gradle

如何用日期替换 XmlGregorianCalendar?

如何用绑定集合的索引填充组合框?

Android | 教你如何用代码一键实现银行卡绑定