【问题标题】:How do I access my variable declared in the MainActivity across my fragments?如何跨片段访问在 MainActivity 中声明的变量?
【发布时间】:2021-12-30 15:31:38
【问题描述】:

我需要将数据从一个片段发送到另一个片段,但似乎无法解决。 有人有什么想法吗?

这是 MainActivity.kt 中的一些代码:

lateinit var movieId: String

fun setMovie(movietitle: String){
        this.movieId = movietitle
    }
    fun getMovie(): String {
        return movieId
    }

这是在第一个片段中:

var movieId: TextView = view.findViewById<EditText>(R.id.TitleId)

(activity as MainActivity).setMovie(movieId.toString())

这是我想要接收字符串的片段:

searchMovieByTitle((activity as MainActivity).getMovie())

我可以通过其他方式接收数据吗?

【问题讨论】:

  • this 有帮助吗?您可以使用 ViewModel 在 Activity 和 Fragment 之间共享数据
  • 变量movieId在MainActivity中声明。我将它设置在 FirstFragment 中,我需要将其传输到 SecondFragment 但从上面的代码传输的数据是一些随机文本。两个片段使用一个变量。我的问题是:如何将字符串从一个片段发送到另一个片段?
  • @jjorigin 如果您使用导航组件,可以考虑使用 SafeArgs,因为您只有一个数据要移动。 developer.android.com/guide/navigation/navigation-pass-data
  • "变量 movieId 在 MainActivity 中声明" - 如果您在共享 ViewModel 中声明它,那么所有组件都可以访问它并观察它的变化。看看我链接的问题。此外,movieId.toString() 不会返回 EditText 中的文本,如果您想要 EditText 中的文本,请使用 movieId.getText().toString()

标签: android kotlin android-fragments


【解决方案1】:

这一定是这里关于 Android 的最常见问题之一,因为原始设计无法轻松连接。您已经找到了一个常见的解决方法(通过父活动协调事情),但您最好的选择是开始使用ViewModels,这是一个 Jetpack 组件,可以抽象出大量工作和复杂性:

这种情况绝非易事,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起。此外,两个 Fragment 都必须处理另一个 Fragment 尚未创建或不可见的情况。

这个常见的痛点可以通过使用ViewModel 对象来解决。这些片段可以共享一个ViewModel,使用它们的活动范围来处理这种通信

(强调我的)

所以,是的,它简化了一堆东西,推荐作为标准,你使用的大多数其他东西都使用它,如果你在 2020 年代使用 Android,这是一件好事。

(您可能还想查看LiveData,它允许您将currentMovie 对象放入您的ViewModel,第二个片段可以observe。当第一个片段将其设置为电影时,第二个片段fragment 自动接收新值,并可以执行诸如显示一些信息、进行搜索或其他操作)

【讨论】:

    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多