startActivity() 与 context.startActivity()
startActivity() vs context.startActivity()
几天前我开始android开发。我实现了一个 recylerview,在 recyclerview 适配器的 OnBindViewHolder 方法中,我在 recyclerview 项目上使用了 setOnClickListener。我的主要目标是在单击 recyclerview 项目时启动一个新的 activity,但在按以下方式实现我的代码时我 运行 撞墙了:
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 但上下文是预期的
没有为参数传递值 'intent'
没有为参数传递值 'options'
在经历了多种解决方案后,我终于偶然发现了这个: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()。
那是因为方法 startActivity()
是 Activity
class 而不是 RecyclerView
的成员,它根本不存在。
顺便说一句,从 RecyclerView 单击开始 Activity 的更好方法是通过回调。
首先,Context是application/object.
的当前状态
有关应用程序环境的全局信息的接口。
这是一个抽象class,其实现由Android系统提供。
它允许访问特定于应用程序的资源,例如颜色、字符串资源、数据库访问和 classes,以及对应用程序级操作(例如启动活动)的向上调用,广播和接收意图等
上下文是 Activity、服务、应用程序等的基础 class
如果您检查 AppCompatActivity 和 Fragment。
然后你可以在里面找到 startActivity() 方法。
你的情况:
在适配器中,如果您需要获取数据库访问权限,字符串资源例如:context.getResources().getString(R.string.yourstring);
需要在运行时在视图上设置颜色,因此您必须需要 application/object 的当前状态是调用上下文并且上下文是一个超级 class.
您可以通过三种方式在适配器中访问上下文。
将上下文作为参数传递给适配器并将其保留为 class 字段。
使用依赖注入,在需要的时候注入Context。我强烈建议阅读 it.e.g: Android Hilt.
最后,
- 从任何视图对象中获取它。就像你做的一样。
holder.itemview.context.
希望对您有所帮助。
几天前我开始android开发。我实现了一个 recylerview,在 recyclerview 适配器的 OnBindViewHolder 方法中,我在 recyclerview 项目上使用了 setOnClickListener。我的主要目标是在单击 recyclerview 项目时启动一个新的 activity,但在按以下方式实现我的代码时我 运行 撞墙了:
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 但上下文是预期的
没有为参数传递值 'intent'
没有为参数传递值 'options'
在经历了多种解决方案后,我终于偶然发现了这个: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()。
那是因为方法 startActivity()
是 Activity
class 而不是 RecyclerView
的成员,它根本不存在。
顺便说一句,从 RecyclerView 单击开始 Activity 的更好方法是通过回调。
首先,Context是application/object.
的当前状态有关应用程序环境的全局信息的接口。
这是一个抽象class,其实现由Android系统提供。
它允许访问特定于应用程序的资源,例如颜色、字符串资源、数据库访问和 classes,以及对应用程序级操作(例如启动活动)的向上调用,广播和接收意图等
上下文是 Activity、服务、应用程序等的基础 class 如果您检查 AppCompatActivity 和 Fragment。 然后你可以在里面找到 startActivity() 方法。
你的情况:
在适配器中,如果您需要获取数据库访问权限,字符串资源例如:context.getResources().getString(R.string.yourstring);
需要在运行时在视图上设置颜色,因此您必须需要 application/object 的当前状态是调用上下文并且上下文是一个超级 class.
您可以通过三种方式在适配器中访问上下文。
将上下文作为参数传递给适配器并将其保留为 class 字段。
使用依赖注入,在需要的时候注入Context。我强烈建议阅读 it.e.g: Android Hilt.
最后,
- 从任何视图对象中获取它。就像你做的一样。 holder.itemview.context.
希望对您有所帮助。