【问题标题】:startActivity() vs context.startActivity()startActivity() 与 context.startActivity()
【发布时间】:2021-12-31 18:39:59
【问题描述】:

几天前我开始了android开发。我实现了一个recyclerview,并且在recyclerview 适配器的OnBindViewHolder 方法中,我在recyclerview 项上使用了setOnClickListener。我的主要目标是在单击 recyclerview 项目时启动一个新活动,但是在以以下方式实现我的代码时我遇到了障碍:

     override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val clusterItem = datalist[position]
    holder.clusterName.setText(clusterItem.name)
    holder.clusterStrat.setText(clusterItem.strats)
    holder.itemview.setOnClickListener() { 
        startActivity(Intent(holder.itemview.context,ClusterSearchActivity::class.java))
    }
}

我在包含 startActivity 的行中有 3 个错误:

类型不匹配:推断类型为 Intent 但预期为 Context

没有为参数“intent”传递值

没有为参数“选项”传递值

在经历了多种解决方案后,我终于偶然发现了这个:https://www.titanwolf.org/Network/q/08ad14d9-cb9a-4b87-923b-f97089db769a/y

使用 context.startActivity(intent) 我像这样重写了我的代码:

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
         val clusterItem = datalist[position]
         holder.clusterName.setText(clusterItem.name)
         holder.clusterStrat.setText(clusterItem.strats)
         holder.itemview.setOnClickListener() {
    holder.itemview.context.startActivity(Intent(holder.itemview.context,ClusterSearchActivity::class.java)) }

}

现在我的代码终于可以运行了,但我似乎不明白为什么我必须使用 context.startActivity()。 我想了解什么时候可以像那样使用 startActivity() 以及什么时候需要使用 context.startActivity()

【问题讨论】:

  • 如果您了解 OOPS 的基础知识,那就没什么好理解的了。 startActivity 是某个类的非静态方法,如果该类调用它,则需要一个 Object 。它是Context 的一个方法,这就是为什么你需要上下文来调用它的原因,因为 Activity 是 Context 的孩子,所以你可以直接在 Activity 中使用它。
  • 一个Activity 本身就是一个Context,所以你不需要使用context...,而RecyclerView 或其适配器不是,所以你需要访问一个有效的Context通过膨胀视图 (itemView.context)。

标签: android kotlin android-activity android-recyclerview


【解决方案1】:
  1. 首先,上下文是应用程序/对象的当前状态。

  2. 有关应用程序环境的全局信息的接口。

  3. 这是一个抽象类,其实现由Android系统提供。

  4. 它允许访问特定于应用程序的资源,例如颜色、字符串资源、数据库访问和类,以及对应用程序级操作的向上调用,例如启动活动、广播和接收意图等。

  5. Context 是 Activity、Service、Application 等的基类 如果您检查 AppCompatActivity 和 Fragment 内部。 然后你可以在里面找到 startActivity() 方法。

在你的情况下:

在适配器中,如果需要获取数据库访问权限,字符串 res 例如:context.getResources().getString(R.string.yourstring);

需要在运行时在视图上设置颜色,因此您必须需要应用程序/对象的当前状态是调用上下文并且上下文是一个超类。

您可以在适配器中通过三种方式访问​​上下文。

  1. 将上下文作为参数传递给适配器并将其保留为类字段。

  2. 在需要的时候使用依赖注入来注入 Context。我强烈建议阅读它。例如:Android Hilt。

终于,

  1. 从任何 View 对象中获取它。就像你做的一样。 holder.itemview.context。

希望对你有帮助。

【讨论】:

  • 我使用哪个视图来获取上下文是否重要?
  • Google 开发者文档的摘录:ViewHolder 描述了一个项目视图和有关其在 RecyclerView 中位置的元数据。 View 类是基类,或者我们可以说它是 Android 中所有 GUI 组件的超类。例如:EditText、Button、CheckBox 等从视图中扩展。 public ViewHolder (View itemView) 每个 ViewHolder 都包含您在构造函数中传递的 itemView 的实例。所以 itemView 也是一个视图,这个方法 holder.itemView.editText.context 也是一个视图。所以从哪里获得上下文并不重要。
【解决方案2】:

这是因为startActivity() 方法是Activity 类的成员,而不是RecyclerView,它根本不存在。

顺便说一句,从 RecyclerView 点击启动 Activity 的更好方法是通过回调。

【讨论】:

猜你喜欢
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2015-11-26
  • 2011-12-23
  • 2019-07-15
  • 2020-12-26
  • 2016-10-01
相关资源
最近更新 更多