隐式Intent因上下文问题失效,startActivity调用报错求助
嗨,我一眼就定位到你的问题啦!你在ViewHolder的shareString方法里调用startActivity时犯了一个小错误——漏传了Context参数,而且这里调用的是ContextCompat的静态startActivity方法,和Activity里的实例方法参数要求不一样,才导致了Required context , found Intent的报错。
问题根源
你当前的代码:
startActivity(Intent.createChooser(intent,"Share to :")) ///Issue occur right here
这里的startActivity是androidx.core.content.ContextCompat.startActivity,它的方法签名是:
public static void startActivity(@NonNull Context context, @NonNull Intent intent, @Nullable Bundle options)
第一个参数必须是Context,但你只传了Intent,编译器自然会报错。而你之前在FragmentActivity里能正常工作,是因为Activity本身就是Context的子类,调用实例方法startActivity时会自动使用自身作为Context,不需要显式传入。
修复方案
有两种简单的修复方式,任选其一即可:
方式一:使用ContextCompat的完整调用
ViewHolder的itemView本身就持有Context,直接用itemView.context作为第一个参数传入,第三个参数传null即可:
fun shareString(user: User) { val message : String = user.name val intent = Intent() intent.action = Intent.ACTION_SEND intent.putExtra(Intent.EXTRA_TEXT,message) intent.type = "text/plain" // 补充Context参数 startActivity(itemView.context, Intent.createChooser(intent,"Share to :"), null) }
方式二:直接调用Context的startActivity方法
更简洁的方式是直接用itemView.context调用Context自带的startActivity方法,和你在Activity里的写法保持一致:
fun shareString(user: User) { val message : String = user.name val intent = Intent() intent.action = Intent.ACTION_SEND intent.putExtra(Intent.EXTRA_TEXT,message) intent.type = "text/plain" // 直接用itemView的Context启动Intent itemView.context.startActivity(Intent.createChooser(intent,"Share to :")) }
为什么之前的上下文传递尝试无效?
你说尝试过传递上下文但无效,大概率是传递的方式不对——比如没有正确拿到ViewHolder关联的Context。而itemView.context是最直接可靠的方式,因为每个View都持有它所在的Context引用,完全不需要从外部额外传递。
这样修改后,点击复制按钮就能正常唤起分享选择器啦!
内容的提问来源于stack exchange,提问作者Rahul

