我试图从另一个Activity类RewardedAd.kt调用MainActivity.kt中定义的runTheAd()方法
我只是遵循了本指南 Google Admob Doc
MainActivity.kt
中的功能fun runTheAd(){
if (mRewardedVideoAd.isLoaded) {
mRewardedVideoAd.show()
}else{
loadRewardedVideoAd()
}
}
拨打 RewardAd.kt
getPoints.setOnClickListener{
MainActivity().runTheAd()
}
Erron Getting
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.takshaksh.layoutout, PID: 28485
kotlin.UninitializedPropertyAccessException: lateinit property mRewardedVideoAd has not been initialized
at com.takshaksh.layoutout.MainActivity.runTheAd(MainActivity.kt:56)
at com.takshaksh.layoutout.RewardedAd$onCreate$1.onClick(RewardedAd.kt:20)
答案 0 :(得分:0)
您需要先创建一个实例。之后调用show方法。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713")
// Use an activity context to get the rewarded video instance.
mRewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this)
mRewardedVideoAd.rewardedVideoAdListener = this
}
我记得您还需要在adMob端进行设置,以激活广告ID和清单的某些操作。因此,在此步骤的某处,连接无法正常工作,这就是为什么未创建实例且结果为错误的原因。
答案 1 :(得分:0)
由于您正在从另一个活动中调用该方法,因此第二个活动无法从MainActivity初始化mRewardedAd
。因此您可以将初始化放入runTheAd
方法中,但这不是最佳实践。
答案 2 :(得分:0)
您无法像这样创建和存储活动实例。相反,您只需使用
开始第二个活动**startActivityForResult**(intent,101);
然后在您的第一个活动中只需覆盖
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
// Check which request we're responding to
if (requestCode == 101) {
//here do start your ad when some condition is satisfied
}
}
在您认为或仅满足某些条件的第二次活动中,只需致电
Intent intent = new Intent();
intent.putExtra("key", "I am done");
setResult(RESULT_OK, intent);
鉴于该活动位于堆栈中,这将在第一个活动中触发 onActivityResult 。您可以在其中编写开始广告的逻辑
第二个选项是创建一些本地广播,并再次使用这些意图与它们非常相似地接收它们。
您可以使用的第三个选项是事件总线,它在实现上也非常简单
在这里您可以阅读更多内容。
Really not getting setResult and onActivityResult