【问题标题】:Can this collection add Fragment codeblock become any simpler (Kotlin)这个集合可以添加片段代码块变得更简单吗(Kotlin)
【发布时间】:2018-03-29 14:27:25
【问题描述】:

我是 Kotlin 的新手。我写这个代码块是为了在后台堆栈中没有片段时添加一个片段。然而,我的代码块看起来有点笨拙。能不能写得更好?

with(supportFragmentManager) {
            takeIf { backStackEntryCount == 0 }
                    ?. apply {
                        with(beginTransaction()) {
                            add(R.id.container, FirstFragment())
                            commit()
                        }
                    }
        }

此外,with(beginTransaction()) 向我显示了 lint 警告,即事务应提交 ()。我认为这与我对它的错误实施有关。请告诉我如何消除该 lint 警告。

编辑 1

不在这里,但在某些地方,我确实与 add() 一起执行了一些其他操作。诸如将片段添加到 backstack 并提供自定义转换之类的东西。

activity?.supportFragmentManager?.let {


            with(it.beginTransaction()) {
                setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left,
                        R.anim.slide_in_right, R.anim.slide_out_right)
                addToBackStack("second")
                replace(R.id.container, SecondFragment())
                commit()
            }

        }

现在有一些方法需要在 FragmentTransaction 对象上调用。这个比较适合我的情况。

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    怎么样

    if(savedInstanceState == null) { // replaces the `takeIf` things
           supportFragmentManager.beginTransaction()
                      .add(R.id.container, FirstFragment())
                      .commit()
    }
    

    【讨论】:

    • 我会说它真的很漂亮。你让我想起了我曾经用 JAVA 编写如此漂亮的代码的日子。我会接受这个答案,但它让我想起了另一个常见的用例。我已经编辑了答案。你也可以尝试另一个简单的答案吗?
    • 我刚刚意识到我们可以像 add() 和 commit() 一样直接链接 addToBackStack() 和 addCustomTransitions()。看起来您的解决方案是最简单的。此外,它几乎不使用任何那些花哨的 Kotlin 功能。美在于简单。谢谢。 :)
    【解决方案2】:

    你知道 kotlin 提供了扩展功能特性,用于简化添加片段的方法,如下面的代码..

            fun Fragment.addReportFragment(): Fragment {
            mFragment = ReportFragment()
            this.fragmentManager?.beginTransaction()?.replace(if (this is ReportFragment) LOGIN_ROOT else MAIN_ROOT, mFragment, REPORT_FRAGMENT)?.commit()
            return mFragment as ReportFragment
        }
    

    以及使用下面代码的简单方法..

        var pickpowerfrag = PickPowerFragment()
        fragmentManager.beginTransaction()
                .replace(R.id.ReplaceFrame, pickpowerfrag)
                .addToBackStack(null)
                .commit()
    

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 2018-10-18
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多